'quá nhiều giá trị để giải nén', lặp đi lặp lại trong một lệnh. khóa => chuỗi, giá trị => danh sách


323

Tôi nhận được 'too many values to unpack'lỗi. Bất cứ ý tưởng làm thế nào tôi có thể khắc phục điều này?

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              

Câu trả lời:


478

Con trăn 2

Bạn cần phải sử dụng một cái gì đó như iteritems.

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

Xem câu trả lời này để biết thêm thông tin về việc lặp qua các từ điển, chẳng hạn như sử dụng items(), trên các phiên bản python.

Con trăn 3

Kể từ khi Python 3 iteritems()không còn được hỗ trợ . Sử dụng items()thay thế.

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

88
Về lý do tại sao bạn cần làm điều này, lặp đi lặp lại qua một từ điển lặp qua các khóa, không phải các cặp khóa / giá trị.
Jeff Mercado

1
@jeffm đó là điều làm tôi bối rối. tôi thấy đây là một bài giảng PHP.
tipu

79

Đối với Python 3.x iteritemsđã bị xóa. Sử dụng vật phẩm thay thế.

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

37

Bạn muốn sử dụng iteritems . Điều này trả về một trình vòng lặp trong từ điển, cung cấp cho bạn một tuple (khóa, giá trị)

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

Vấn đề của bạn là bạn đã lặp qua các trường, trong đó trả về các khóa của từ điển.

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

9

Đối với danh sách, sử dụng enumerate

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

iteritems sẽ không làm việc cho các đối tượng danh sách


Đây phải là một câu trả lời đúng (đã được kiểm tra) cho python 2.7 ít nhất.
Dũng

1

Trong Python3 iteritems()không còn được hỗ trợ

GIẢI PHÁP1 :

Sử dụng .items

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

GIẢI PHÁP2 :

Bạn có thể sử dụng enumerate()cũng

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

0

Không thể lặp lại trực tiếp trong từ điển. Vì vậy, bạn có thể thông qua chuyển đổi thành 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)

Hãy giải thích câu trả lời của bạn.
Maciej Jureczko

Không thể lặp lại trực tiếp trong từ điển. Vì vậy, bạn có thể thông qua chuyển đổi thành tuple.
satya naraya pardhi

0

bạn đang thiếu fields.iteritems()mã của bạn

Bạn cũng có thể làm theo cách khác, nơi bạn nhận được các giá trị bằng cách sử dụng các khóa trong từ điển.

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
Chào mừng bạn đến với Stack Overflow! Nói chung, câu trả lời sẽ hữu ích hơn nhiều nếu chúng bao gồm một lời giải thích về những gì mã được dự định làm và tại sao điều đó giải quyết vấn đề mà không giới thiệu người khác.
Tim Diekmann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.