ฉันจะแปลงพจนานุกรมเป็นรายการสิ่งอันดับได้อย่างไร


219

หากฉันมีพจนานุกรมเช่น:

{ 'a': 1, 'b': 2, 'c': 3 }

ฉันจะแปลงเป็นสิ่งนี้ได้อย่างไร

[ ('a', 1), ('b', 2), ('c', 3) ]

และฉันจะแปลงเป็นสิ่งนี้ได้อย่างไร

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
garej

1
@garej: ให้xอยู่แล้วtupleในรหัสของคุณ (มันเป็นธรรมชาติของitemsการผลิตของ iterable tuples), มันจะง่าย / เร็วขึ้นเพื่อทำ[x[::-1] for x in d.items()]; ชิ้นที่ย้อนกลับสร้างtupleขนาดที่เหมาะสมโดยตรงแทนที่จะมีตัวtupleสร้างแบบซ้ำ ๆ ซ้ำ ๆ กัน (ด้วยการหาตำแหน่งโดยรวมและการปรับขนาดในตอนท้าย) a tupleจากตัวreversedวนซ้ำ
ShadowRanger

@ShadowRanger คุณพูดถูก ฉันต้องการชัดเจนว่าไม่จำเป็นต้องมีk, vรูปแบบเสมอไปในกรณีเช่นนี้
garej

หมายเหตุ:เพิ่มcompatibilityแท็กเนื่องจากความแตกต่างของ py2.x // py3.x
dreftymac

คำตอบ:


360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

มันไม่ได้อยู่ในลำดับที่คุณต้องการ แต่ dicts ไม่มีคำสั่งซื้อเฉพาะ 1เรียงลำดับหรือจัดระเบียบตามความจำเป็น

ดู: items () , iteritems ()


ใน Python 3.x คุณจะไม่ใช้iteritems(ซึ่งไม่มีอยู่อีกต่อไป) แต่ใช้แทนitemsซึ่งตอนนี้จะส่งกลับ "มุมมอง" ลงในรายการพจนานุกรม ดูมีอะไรใหม่เอกสารสำหรับ Python 3.0 และใหม่เอกสารเกี่ยวกับมุมมอง

1: การเก็บรักษาลำดับการแทรกสำหรับ dicts ถูกเพิ่มใน Python 3.7


8
items () ส่งคืนมุมมอง dict_keys ใน python3 ล้อมสายนี้ด้วยการส่งไปยังรายการ "list ()" ดูการตอบกลับของ @ SilentGhost
Erich

55

เนื่องจากไม่มีใครทำฉันจะเพิ่มรุ่น py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]

18

คุณสามารถใช้รายการความเข้าใจ

[(k,v) for k,v in a.iteritems()] 

คุณจะได้รับ[ ('a', 1), ('b', 2), ('c', 3) ]และ

[(v,k) for k,v in a.iteritems()] 

ตัวอย่างอื่น ๆ

อ่านเพิ่มเติมเกี่ยวกับรายการความเข้าใจหากคุณต้องการมันน่าสนใจมาก ๆ ที่คุณสามารถทำได้


10

สร้างรายการของชื่อ tuples

มันก็มักจะมีประโยชน์มากที่จะใช้namedtuple ตัวอย่างเช่นคุณมีพจนานุกรมชื่อ 'เป็นกุญแจและ' คะแนน 'เป็นค่าเช่น:

d = {'John':5, 'Alex':10, 'Richard': 7}

คุณสามารถแสดงรายการเป็น tuples เรียงลำดับตามที่คุณต้องการและรับชื่อและคะแนนสมมติว่าผู้เล่นที่มีคะแนนสูงสุด (ดัชนี = 0) มีลักษณะแบบงูหลามนี้มาก:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

วิธีทำ:

รายการในลำดับแบบสุ่มหรือเก็บคำสั่งของคอลเลกชัน OrderDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

เรียงตามค่า ('คะแนน'):

import collections
Player = collections.namedtuple('Player', 'score name')

เรียงลำดับด้วยคะแนนต่ำสุดก่อน:

worst = sorted(Player(v,k) for (k,v) in d.items())

เรียงลำดับด้วยคะแนนสูงสุดก่อน:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7

สิ่งที่คุณต้องการคือdict's items()และiteritems()วิธีการ itemsส่งคืนรายการของ tuples (คีย์ค่า) เนื่องจากสิ่งอันดับเป็นสิ่งที่ไม่เปลี่ยนรูปแบบจึงไม่สามารถกลับรายการได้ ดังนั้นคุณจะต้องวนซ้ำไอเท็มและสร้างสิ่งอันดับใหม่เพื่อรับอันดับแบบย้อนกลับ (ค่าคีย์) สำหรับการวนซ้ำนั้นiteritemsจะดีกว่าเนื่องจากใช้ตัวกำเนิดเพื่อสร้างสิ่งอันดับ (คีย์ค่า) แทนที่จะเก็บรายการทั้งหมดไว้ในหน่วยความจำ

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 


5

นี่คือการเปลี่ยนแปลงที่ไม่หยุดยั้งจาก Python 3.x และ Python 2.x

สำหรับการใช้งาน Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

สำหรับการใช้งาน Python 2.7

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)


4

โดยkeys()และvalues()วิธีการของพจนานุกรมและzipวิธีการของพจนานุกรมและ

zip จะส่งคืนรายการของสิ่งอันดับซึ่งทำหน้าที่เหมือนพจนานุกรมที่เรียงลำดับ

การสาธิต:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

สิ่งนี้ใช้ได้ผลกับฉันในฐานะทางเลือกcollections.OrderedDict()ที่ทำงานได้ดีกว่ากับ Python HTTP Requests หลายเวอร์ชัน แม้ว่าฉันจะไม่ชอบzipชื่อฟังก์ชั่นที่ค่อนข้างคลุมเครือ / โอเวอร์โหลด
MarkHu

โปรดทราบว่าการzipระบุไม่ใช่การคัดเลือกนักแสดง "ลึก" กล่าวคือหากมีเด็กซ้อนกันพวกเขาจะไม่ได้รับผลกระทบ คุณอาจต้องม้วนการสอบถามซ้ำของคุณเอง
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
แม้ว่ารหัสนี้อาจช่วยในการแก้ปัญหา แต่ก็ไม่ได้อธิบายว่าทำไมและ / หรือวิธีการตอบคำถาม การให้บริบทเพิ่มเติมนี้จะช่วยเพิ่มมูลค่าทางการศึกษาในระยะยาวอย่างมีนัยสำคัญ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อ จำกัด และข้อสมมติฐานที่ใช้
Toby Speight

3

คนที่เรียบง่ายกว่าก็คือ

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

คนที่สองนั้นไม่ใช่คนง่าย ๆ แต่ใช่

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