หลาม tuple เพื่อ dict


149

สำหรับ tuple ให้t = ((1, 'a'),(2, 'b')) dict(t)ส่งคืน{1: 'a', 2: 'b'}

มีวิธีที่ดีที่จะได้รับ{'a': 1, 'b': 2}(ปุ่มและ vals แลกเปลี่ยน)?

ในท้ายที่สุดฉันต้องการที่จะ1ได้รับคืน'a'หรือ2ได้รับ'b'การแปลงเป็นคำพูดไม่ใช่วิธีที่ดีที่สุด

คำตอบ:


277

ลอง:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 สวย !, dict(zip(*zip(*t)[::-1]))ผมต้องลองกับซิป สิ่งนี้ช้ากว่าขี้เหร่และใช้หนทางมากขึ้น
kevpie

@kevpie สิ่งมหัศจรรย์เกี่ยวกับ Python คือมีหลายร้อยวิธีในการแสดงวิธีการทำบางสิ่งแต่ละอย่างน่าสนใจเหมือนกัน
bjd2385

เยี่ยมมากถ้าสิ่งที่คุณมีคือทริปเปิ้ลคุณสามารถทำได้: dict((x, y) for x, y, z in t)หรือdict((x, (y, z)) for x, y, z in t)เพื่อให้ได้ค่าที่สองและสามเป็น tuple
guival

รวดเร็วครอบคลุมและง่ายมาก คำตอบที่สมบูรณ์แบบ
gies0r

73

วิธีที่ง่ายกว่าเล็กน้อย:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
อะไรทำให้เร็วขึ้น
maazza

9
ฟังก์ชั่นแผนที่และ dict ใช้งานใน C และเร็วกว่ารุ่นไพ
ธ อนมาก

1
ฉันชอบสิ่งนี้เพราะการreverseสะกดคำออกมาอย่างชัดเจน
Frerich Raabe

4
@maazza: โดยทั่วไปการทดสอบประสิทธิภาพชี้ให้เห็นว่า (ในการใช้ C อย่างน้อย) mapจะเร็วกว่าความเข้าใจเมื่อสิ่งที่ถูกแมปเป็นฟังก์ชั่นในตัว (เช่นreversed); ในกรณีอื่น ๆ ส่วนใหญ่ตรงกันข้ามเป็นจริง แต่มันจะดีกว่าไปที่โปรไฟล์กว่าเดา :)
คาร์ล Knechtel


9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

หรือ:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

ฉันไม่เห็นว่าคำตอบของ OP นี้เป็นอย่างไร
Luca Amerio

4

หากมีหลายค่าสำหรับคีย์เดียวกันรหัสต่อไปนี้จะผนวกค่าเหล่านั้นเข้ากับรายการที่สอดคล้องกับคีย์

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

นี่คือวิธีการทำสองวิธี:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.