'troppi valori da decomprimere', ripetendo un dict. chiave => stringa, valore => elenco


323

Ricevo l' 'too many values to unpack'errore. Qualche idea su come posso risolvere questo problema?

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              

Risposte:


478

Python 2

Devi usare qualcosa di simile iteritems.

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

Vedi questa risposta per ulteriori informazioni sull'iterazione attraverso i dizionari, come l'utilizzo items(), attraverso le versioni di Python.

Python 3

Poiché Python 3 noniteritems() è più supportato . Usa items()invece.

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

88
Per quanto riguarda il motivo per cui è necessario eseguire questa operazione, iterando su un dizionario scorre le chiavi, non le coppie chiave / valore.
Jeff Mercado,

1
@jeffm è quello che mi ha confuso. ho visto questo come un PHP foreach.
tipu

79

Per Python 3.x iteritemsè stato rimosso. Usa invece gli oggetti .

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

37

Vuoi usare iteritems . Questo restituisce un iteratore sul dizionario, che ti dà una tupla (chiave, valore)

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

Il tuo problema era che stavi eseguendo il ciclo sui campi, che restituisce le chiavi del dizionario.

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

9

Per gli elenchi, utilizzare enumerate

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

iteritems non funzionerà per gli oggetti elenco


Questa dovrebbe essere una risposta corretta (testata) almeno per Python 2.7.
Dung

1

In Python3 iteritems()non è più supportato

SOLUZIONE 1 :

Uso .items

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

SOLUZIONE2 :

È possibile utilizzare enumerate()come pure

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

0

Non è possibile eseguire l'iterazione direttamente nel dizionario. Quindi puoi convertirti in tupla .

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)

Per favore, spiega la tua risposta.
Maciej Jureczko,

Non è possibile eseguire l'iterazione direttamente nel dizionario. Quindi puoi convertirti in tupla.
satya narayan pardhi,

0

ti manca fields.iteritems()nel tuo codice.

Potresti anche farlo in un altro modo, dove ottieni valori usando le chiavi nel dizionario.

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
Benvenuto in Stack Overflow! In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri.
Tim Diekmann il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.