อะไรคือวิธีที่ถูกต้องในการเริ่มต้นพจนานุกรมแบบเรียงลำดับ (OD) เพื่อที่จะรักษาลำดับของข้อมูลเริ่มต้น
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
คำถาม:
จะ
OrderedDict
รักษาลำดับของรายการทูเปิลหรือทูเพิลของทูเพิลหรือทูเพิลของลิสต์หรือลิสต์ลิสต์อื่น ๆ ที่ส่งผ่านในช่วงเวลาของการเริ่มต้น (ตัวอย่างที่ 2 และ 3 ด้านบน) หรือไม่เราจะตรวจสอบได้อย่างไรว่า
OrderedDict
รักษาคำสั่งซื้อจริงหรือไม่? เนื่องจาก adict
มีคำสั่งที่ไม่สามารถคาดเดาได้จะเกิดอะไรขึ้นถ้าเวกเตอร์ทดสอบของฉันโชคดีมีลำดับเริ่มต้นเหมือนกับลำดับที่คาดเดาไม่ได้ของ Dict? ตัวอย่างเช่นถ้าแทนที่d = OrderedDict({'b':2, 'a':1})
ฉันจะเขียนd = OrderedDict({'a':1, 'b':2})
ฉันสามารถสรุปได้อย่างผิด ๆ ว่าคำสั่งนั้นถูกเก็บรักษาไว้ ในกรณีนี้ฉันพบว่า adict
เรียงลำดับตามตัวอักษร แต่นั่นอาจไม่จริงเสมอไป วิธีใดเป็นวิธีที่เชื่อถือได้ในการใช้ตัวอย่างเพื่อตรวจสอบว่าโครงสร้างข้อมูลรักษาคำสั่งซื้อหรือไม่โดยไม่ต้องพยายามทดสอบเวกเตอร์ซ้ำ ๆ จนกว่าจะแตก
ป.ล. ฉันจะทิ้งสิ่งนี้ไว้ที่นี่เพื่อใช้อ้างอิง : "ตัวสร้าง OrderDict และวิธีการ update () ทั้งสองยอมรับอาร์กิวเมนต์คำหลัก แต่คำสั่งของพวกเขาหายไปเนื่องจากฟังก์ชันการเรียกใช้ความหมายของ Python อาร์กิวเมนต์คำหลัก pass-in โดยใช้พจนานุกรมที่ไม่มีการเรียงลำดับปกติ"
PPS: หวังว่าในอนาคต OrderDict จะรักษาลำดับของ kwargs ไว้ด้วย (ตัวอย่างที่ 1): http://bugs.python.org/issue16991