'มีค่ามากเกินไปที่จะนำออกจากบรรจุภัณฑ์' วนซ้ำตามคำบอก key => string, value => รายการ


323

ฉันได้รับ'too many values to unpack'ข้อผิดพลาด ความคิดใดที่ฉันสามารถแก้ไขได้

first_names = ['foo', 'bar']
last_names = ['gravy', 'snowman']

fields = {
    'first_names': first_names,
    'last_name': last_names,
}        

for field, possible_values in fields:  # error happens on this line              

คำตอบ:


478

Python 2

iteritemsคุณจำเป็นต้องใช้สิ่งที่ต้องการ

for field, possible_values in fields.iteritems():
    print field, possible_values

ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการวนซ้ำผ่านพจนานุกรมเช่นการใช้items()ข้ามเวอร์ชันของไพ ธ อน

Python 3

ตั้งแต่หลาม 3 iteritems()จะไม่ได้รับการสนับสนุน ใช้items()แทน

for field, possible_values in fields.items():
    print(field, possible_values)

88
สำหรับเหตุผลที่คุณต้องทำเช่นนี้การวนซ้ำพจนานุกรมจะทำซ้ำผ่านคีย์ไม่ใช่คู่คีย์ / ค่า
Jeff Mercado

1
@jeffm นั่นคือสิ่งที่ทำให้ฉันสับสน ฉันเห็นสิ่งนี้เป็น PHP foreach
tipu


37

คุณต้องการที่จะใช้iteritems ส่งคืนตัววนซ้ำในพจนานุกรมซึ่งให้ tuple (คีย์ค่า)

>>> for field, values in fields.iteritems():
...     print field, values
... 
first_names ['foo', 'bar']
last_name ['gravy', 'snowman']

ปัญหาของคุณคือคุณวนลูปมากกว่าฟิลด์ซึ่งส่งคืนคีย์ของพจนานุกรม

>>> for field in fields:
...     print field
... 
first_names
last_name

9

สำหรับรายการใช้ enumerate

for field, possible_values in enumerate(fields):
    print(field, possible_values)

iteritems จะไม่ทำงานกับรายการวัตถุ


นี่ควรเป็นคำตอบที่ถูกต้อง (ทดสอบ) สำหรับ python 2.7 เป็นอย่างน้อย
Dung

1

ใน Python3 iteritems()ไม่รองรับอีกต่อไป

SOLUTION1 :

ใช้ .items

for field, possible_values in fields.items():
    print(field, possible_values)

SOLUTION2 :

คุณสามารถใช้enumerate()เช่นกัน

for field, possible_values in enumerate(fields):
    print(field, possible_values)

0

ไม่สามารถทำซ้ำโดยตรงในพจนานุกรม ดังนั้นคุณสามารถแปลงเป็น tupleได้

first_names = ['foo', 'bar']
last_names = ['gravy', 'snowman']

fields = {
    'first_names': first_names,
    'last_name': last_names,
         } 
tup_field=tuple(fields.items())
for names in fields.items():
     field,possible_values = names
     tup_possible_values=tuple(possible_values)
     for pvalue in tup_possible_values:
           print (field + "is" + pvalue)

กรุณาอธิบายคำตอบของคุณ
Maciej Jureczko

ไม่สามารถทำซ้ำโดยตรงในพจนานุกรม ดังนั้นคุณสามารถแปลงเป็น tuple ได้
satya narayan pardhi

0

คุณหายไปfields.iteritems()ในรหัสของคุณ

นอกจากนี้คุณยังสามารถทำได้ด้วยวิธีอื่นซึ่งคุณจะได้รับค่าโดยใช้กุญแจในพจนานุกรม

for key in fields:
    value = fields[key]

0
data = (['President','George','Bush','is','.'],['O','B-PERSON','I-PERSON','O','O'])
corpus = []
for(doc,tags) in data:
    doc_tag = []
    for word,tag in zip(doc,tags):
        doc_tag.append((word,tag))
        corpus.append(doc_tag)
        print(corpus)

4
ยินดีต้อนรับสู่ Stack Overflow! โดยทั่วไปแล้วคำตอบจะมีประโยชน์มากขึ้นหากพวกเขามีคำอธิบายว่าควรใช้รหัสใดและเหตุใดจึงแก้ปัญหาได้โดยไม่ต้องแนะนำผู้อื่น
ทิม Diekmann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.