‘too many values to unpack’, iterând peste un dict. key=>string, value=>list (Programare, Python)

tipu a intrebat.

Primesc 'too many values to unpack' eroare. Aveți vreo idee despre cum pot rezolva acest lucru?

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              

8 răspunsuri
Philip Southam

Python 2

Trebuie să utilizați ceva de genul iteritems.

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

Vedeți acest răspuns pentru mai multe informații despre iterarea prin dicționare, cum ar fi utilizarea items(), în toate versiunile python.

Python 3

De la Python 3 iteritems() este nu mai este suportat. Utilizați items() în loc.

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

Comentarii

    102

  • În ceea ce privește motivul pentru care trebuie să faceți acest lucru, iterarea peste un dicționar itera prin chei, nu prin perechile cheie/valoare. –  > Por Jeff Mercado.
  • @jeffm asta m-a derutat. am văzut asta ca pe un foreach PHP. –  > Por tipu.
Meistro

Pentru Python 3.x iteritems a fost eliminat. Utilizați items în loc.

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

Mike Lewis

Doriți să utilizați iteritems. Acesta returnează un iterator peste dicționar, care vă oferă un tuple(cheie, valoare)

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

Problema ta era că făceai o buclă peste câmpuri, care returnează cheile din dicționar.

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

Jordan

Pentru liste, utilizați enumerate

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

iteritems nu va funcționa pentru obiectele listă

Comentarii

  • Acesta ar trebui să fie un răspuns corect (testat) cel puțin pentru python 2.7. –  > Por Dung.
  • am făcut-o pentru metoda glob care listează fișierele din director. files=glob.glob(„*.pdf”) for index, filename in enumerate(files): # o anumită logică –  > Por Serhat Koroglu.
Vaibhav Desai

vă lipsește fields.iteritems() în codul tău.

Ați putea, de asemenea, să o faceți în alt mod, în care să obțineți valorile folosind cheile din dicționar.

for key in fields:
    value = fields[key]

satya narayan pardhi

Nu poate fi iterat direct în dicționar. Așa că puteți prin convertirea în 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)

Comentarii

  • Vă rugăm să vă explicați răspunsul. –  > Por Maciej Jureczko.
  • Nu poate fi iterat direct în dicționar. Deci, puteți să o faceți prin conversia în tuple. –  > Por satya narayan pardhi.
ishandutta2007

În Python3 iteritems() nu mai este suportat

Utilizați .items

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

Comentarii

  • Din câte îmi dau seama, enumerate() stochează de fapt indexul în poziția în care field este. –  > Por Jesse Reza Khorasanee.
Sakshi
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)

Comentarii

  • Bine ați venit la Stack Overflow! În general, răspunsurile sunt mult mai utile dacă includ o explicație a ceea ce se intenționează să facă codul și de ce acesta rezolvă problema fără a introduce altele. –  > Por Tim Diekmann.

Tags: