การแปลงคำสั่งเป็น OrderDict


139

ฉันมีปัญหาในการใช้collections.OrderedDictชั้นเรียน ฉันใช้ Python 2.7 บน Raspbian, Debian distro สำหรับ Raspberry Pi ฉันกำลังพยายามพิมพ์พจนานุกรมสองเล่มเพื่อเปรียบเทียบ (เคียงข้างกัน) สำหรับการผจญภัยแบบข้อความ ลำดับเป็นสิ่งสำคัญในการเปรียบเทียบอย่างถูกต้อง ไม่ว่าฉันจะลองใช้พจนานุกรมพิมพ์ด้วยวิธีที่ไม่เรียงลำดับตามปกติ

นี่คือสิ่งที่ฉันได้รับเมื่อฉันทำบน RPi ของฉัน:

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

เห็นได้ชัดว่ามีบางอย่างไม่ถูกต้องเนื่องจากกำลังพิมพ์การเรียกใช้ฟังก์ชันและวางคีย์และกลุ่มค่าไว้ในรายการที่ซ้อนกัน ...

นี่คือสิ่งที่ฉันได้รับจากการเรียกใช้สิ่งที่คล้ายกันบนพีซีของฉัน:

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

คราวนี้เป็นไปตามลำดับ แต่ไม่ควรพิมพ์อย่างอื่นใช่ไหม? (การใส่ลงในรายการและแสดงการเรียกใช้ฟังก์ชัน)

ฉันทำผิดพลาดตรงไหน ไม่น่าจะเกี่ยวอะไรกับ Python เวอร์ชั่น pi เพราะมันเป็นแค่เวอร์ชั่น Linux


3
หมายเหตุ: OrderedDictจัดเรียงตามลำดับการแทรกไม่ใช่ลำดับคีย์ที่เป็นตัวอักษรและตัวเลข
el.pescado

คำตอบ:


222

คุณกำลังสร้างพจนานุกรมก่อนจากนั้นจึงส่งพจนานุกรมนั้นไปยังOrderedDictไฟล์. สำหรับ Python เวอร์ชัน <3.6 (*)เมื่อคุณทำเช่นนั้นการเรียงลำดับจะไม่ถูกต้องอีกต่อไป dictไม่ได้รับคำสั่งโดยเนื้อแท้

ส่งตามลำดับของสิ่งที่เพิ่มขึ้นแทน:

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

สิ่งที่คุณเห็นเมื่อคุณพิมพ์OrderedDictคือภาพแทนและถูกต้องทั้งหมด OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])เพียงแค่แสดงให้คุณเห็นในการแสดงที่ทำซ้ำได้ว่าเนื้อหาเป็นOrderedDictอย่างไร


(*) : ในการใช้งาน CPython 3.6 dictประเภทได้รับการอัปเดตเพื่อใช้โครงสร้างภายในหน่วยความจำที่มีประสิทธิภาพมากขึ้นซึ่งมีผลข้างเคียงที่มีความสุขในการรักษาลำดับการแทรกและโดยการขยายรหัสที่แสดงในคำถามจะทำงานได้โดยไม่มีปัญหา สำหรับ Python 3.7 ข้อกำหนดภาษา Pythonได้รับการอัปเดตเพื่อกำหนดให้การใช้งาน Python ทั้งหมดต้องเป็นไปตามลักษณะการทำงานนี้ ดูคำตอบอื่น ๆ ของฉันสำหรับรายละเอียดและเหตุผลที่คุณยังอาจต้องการใช้OrderedDict()ในบางกรณี


ตกลง OrderDict จะสร้างพจนานุกรมให้ฉันไหม นอกจากนี้ในการพิมพ์โดยไม่มีการแทนค่าที่ทำซ้ำได้ฉันสามารถพิมพ์ตัวแปร OrderDict ที่ใช้ใน? คือ: print ship ?? ขอบคุณ :)
pythonpiboy

3
คำถาม: ตามวิธีที่คุณได้อธิบายไว้ OrderDict กำลังสร้าง "รายการ" ตามลำดับ สิ่งนั้นไม่พ่ายแพ้ต่อวัตถุประสงค์หรือไม่? มันสร้างแค่รายการองค์ประกอบไม่ใช่พจนานุกรมที่มีคีย์และค่า ...
pythonpiboy

9
ประเภททำหน้าที่เหมือนทั้งสองอย่าง การทำแผนที่ที่รักษาลำดับ เพื่อสร้างเป็นหนึ่งเดียวกับการสั่งซื้อที่คุณต้องการที่จะให้มันรายการในการสั่งซื้อ เนื่องจากคำสั่งมาตรฐาน (ในสิ่งอื่นที่ไม่ใช่ PyPI หรือ Python 3.6+) ไม่สามารถทำได้คุณจึงให้รายการสิ่งที่เพิ่มขึ้นแทน เมื่อOrderedDictมีการสร้างมันเป็นพจนานุกรม
Martijn Pieters

4
ดูเหมือนว่าจะเกิดความสับสนจากการสมมติว่า OrderDict "ใช้" คำสั่งซื้อแทนที่จะเป็นเพียงการรักษาการสั่งซื้อ ฉันคิดว่ามันจะเรียงลำดับอินพุตเมื่อสร้าง - หรือฟังก์ชั่น items () จะส่งคืนรายการที่เรียงลำดับโดยไม่คำนึงถึงเวลาที่แทรก แต่จะเก็บทุกคำสั่งที่คุณให้ไว้
whiterook6

2
@ whiterook6: ไม่ใช่พจนานุกรมเรียงลำดับ เป็นพจนานุกรมแบบเรียงลำดับซึ่งเป็นพจนานุกรมที่บันทึกลำดับของคู่คีย์ - ค่าและให้คุณเรียงลำดับคู่เหล่านั้นใหม่ได้ เปรียบเทียบนี้ไปยังรายการที่มีการสั่งซื้อลำดับ
Martijn Pieters

38

หากคุณไม่สามารถแก้ไขส่วนนี้ของโค้ดที่กำหนดคำสั่งของคุณคุณยังคงสามารถสั่งซื้อได้ทุกเมื่อในแบบที่คุณต้องการดังนี้:

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

11

เวลาส่วนใหญ่ที่เราใช้ OrderDict เมื่อเราต้องการคำสั่งซื้อที่กำหนดเองไม่ใช่คำสั่งทั่วไปเช่น ASC เป็นต้น

นี่คือทางออกที่เสนอ:

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

สิ่งนี้จะถูกส่งออก:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

หมายเหตุ : พจนานุกรมที่จัดเรียงใหม่จะคงลำดับการจัดเรียงไว้เมื่อรายการถูกลบ แต่เมื่อมีการเพิ่มคีย์ใหม่คีย์จะถูกต่อท้ายและไม่มีการจัดเรียง ( เอกสารอย่างเป็นทางการ )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.