'açmak için çok fazla değer', bir dikte üzerinde yineleme. key => dize, değer => liste


323

Ben alıyorum 'too many values to unpack'hata. Bunu nasıl düzeltebileceğim hakkında bir fikrin var mı?

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              

Yanıtlar:


478

Python 2

Gibi bir şey kullanmalısın iteritems.

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

Python sürümlerinde sözlükler aracılığıyla yineleme hakkında daha fazla bilgi için bu cevaba bakınız items().

Python 3

Yana Python 3 iteritems() edilir artık desteklenmemektedir . items()Bunun yerine kullanın .

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

88
Bunu neden yapmanız gerektiğine gelince, sözlük üzerinden yineleme yapmak anahtar / değer çiftlerini değil, anahtarları tekrarlar.
Jeff Mercado

1
@jeffm beni şaşırtan şey bu. Ben bir PHP foreach olarak gördüm.
tipu

79

Python 3.x iteritemsiçin kaldırıldı. Kullanım öğeleri yerine.

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

37

Kullanmak istediğiniz iteritems . Bu, sözlük üzerinde bir yineleyici döndürür, bu da size bir demet (anahtar, değer) verir

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

Sorun, sözlüğü anahtarları döndüren alanlar üzerinde döngü vardı.

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

9

Listeler için şunu kullanın: enumerate

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

iteritems liste nesneleri için çalışmaz


Bu en azından python 2.7 için doğru bir cevap (test edilmiş) olmalıdır.
Gübre

1

Python3'te iteritems()artık desteklenmiyor

ÇÖZÜM1 :

kullanım .items

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

ÇÖZÜM2 :

Sen kullanabilirsiniz enumerate()yanı

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

0

Doğrudan sözlükte yineleme yapılamaz. Böylece tuple dönüştürmek yoluyla yapabilirsiniz .

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)

Lütfen cevabınızı açıklayınız.
Maciej Jureczko

Doğrudan sözlükte yineleme yapılamaz. Böylece tuple dönüştürmek yoluyla yapabilirsiniz.
satya narayan pardhi

0

Eğer eksik fields.iteritems()kodunuzda.

Bunu, sözlükteki anahtarları kullanarak değer aldığınız başka bir yolla da yapabilirsiniz.

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'a hoş geldiniz! Genellikle, kodun ne yapması gerektiği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır.
Tim Diekmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.