วิธีการแปลงรายการสิ่งที่สำคัญ - ค่าเป็นพจนานุกรม?


125

ฉันมีรายการที่ดูเหมือน:

[('A', 1), ('B', 2), ('C', 3)]

ฉันต้องการเปลี่ยนเป็นพจนานุกรมที่ดูเหมือนว่า:

{'A': 1, 'B': 2, 'C': 3}

วิธีที่ดีที่สุดในการดำเนินการนี้คืออะไร?

แก้ไข: รายการทูเปิลของฉันเป็นจริงมากกว่า:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
สิ่งที่ชนิดของหน่วยงานเหล่านั้นA, B(หรือBERA) และC(หรือCE) จริงๆคืออะไร? ขอบคุณ
กิน

ฉันยินดีที่จะเดิมพันว่าข้อผิดพลาดที่เกิดขึ้นจากตัวอย่างการทำงานด้านล่างเกี่ยวข้องกับการที่เขาไม่มีรายการสิ่งที่ดึงดูด แต่เป็นรายการที่ยาวมากที่เขาต้องการแยกออกเป็น 2 สิ่ง
gddc

คำตอบ:


90

สิ่งนี้ทำให้ฉันมีข้อผิดพลาดเช่นเดียวกับการพยายามแยกรายการและบีบอัด ValueError: องค์ประกอบลำดับการอัปเดตพจนานุกรม # 0 มีความยาว 1916; ต้องระบุ 2

นั่นคือคำถามที่แท้จริงของคุณ

คำตอบคือองค์ประกอบของรายการไม่ใช่สิ่งที่คุณคิด หากคุณพิมพ์myList[0]คุณจะพบว่าองค์ประกอบแรกของรายการของคุณไม่ใช่สองทูเพิลเช่น('A', 1)แต่เป็นการทำซ้ำที่มีความยาวปี 1916

เมื่อคุณจริงมีรายชื่อในรูปแบบที่คุณระบุไว้ในคำถามเดิมของคุณ ( myList = [('A',1),('B',2),...]) dict(myList)ทั้งหมดที่คุณต้องทำคือ


ขอบคุณฉันไม่รู้ว่ารายการเป็นเช่นนั้นได้อย่างไร แต่หลังจากนำกลับมาใช้ใหม่ตั้งแต่ต้นฉันก็สามารถแก้ไขได้
Fred Wilson

1
@DJ_Stuffy_K: (สมมติว่าบริบทไม่เกี่ยวข้องกับคำถามนี้) โดยทั่วไปเว้นแต่ว่าจะไม่จำเป็นหรือทำให้โปรแกรมของคุณช้าลงการสร้างคำสั่งเป็นดัชนีที่เป็นประโยชน์ในโครงสร้างข้อมูลนามธรรมที่คุณสร้างโดยปริยาย แนวคิดเรื่อง "แนวปฏิบัติที่ดี" ขึ้นอยู่กับบริบททั้งหมด คุณต้องการเวลาค้นหาคีย์ O (1) หรือไม่? นอกจากนี้คุณไม่สามารถ "แปลงรายการเป็นพจนานุกรม" โดยพลการ ทั้งหมดขึ้นอยู่กับความหมาย เช่น[(1,2), (1,3)]-> {1:3}จะอุดกุญแจของคุณและสูญเสียข้อมูล! Dict คือความสัมพันธ์แบบหนึ่งต่อ * กับ O (1) เวลาแทรก / ลบ รายการคือรายการ
ninjagecko

163
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
แสดงความคิดเห็นในคำตอบอื่นที่แนะนำเหมือนกัน: สิ่งนี้ไม่ครอบคลุมถึงการมี 'คีย์' ทูเพิลที่ซ้ำกันเช่น: l=[('A',1), ('B',2), ('C',3), ('A', 2)]จะส่งผลให้มี'A': 1ซึ่งอาจไม่ได้ผลลัพธ์ที่ต้องการ
guival

32

คุณลองสิ่งนี้แล้วหรือยัง?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: องค์ประกอบลำดับการอัปเดตพจนานุกรม # 0 มีความยาว 1916; 2 เป็นสิ่งจำเป็น
Fred Wilson

นั่นคือการตัดตรงจากเทอร์มินัลของฉันดังนั้นควรใช้งานได้ คุณสามารถแสดงสิ่งที่คุณทำเพื่อให้เกิดข้อผิดพลาดนั้นได้หรือไม่?
ไร้ประโยชน์

@ คุณเฟรดคุณต้องพิมพ์อะไรผิดคำตอบนี้ใช้ได้
martineau

@FredWilson นั่นคือข้อผิดพลาดที่คุณมักจะได้รับเมื่อลองทำสิ่งที่ชอบdict([string1, string2, string3, string4])
chacham15

2
ไม่ครอบคลุมถึงการมี 'คีย์' ทูเพิลที่ซ้ำกันเช่นl=[('A',1), ('B',2), ('C',3), ('A', 2)]จะส่งผลให้มี'A': 1ซึ่งอาจไม่ใช่ผลลัพธ์ที่ต้องการ
guival

10

นี่คือวิธีจัดการ "คีย์" ทูเพิลที่ซ้ำกัน:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

! น่ากลัว ช่วยฉันออกไป
unpairestgood

เยี่ยมมาก! ช่วยได้มาก
Athar

2

อีกวิธีหนึ่งในการใช้ความเข้าใจในพจนานุกรม

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}


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