'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.