'terlalu banyak nilai untuk dibuka', iterasi dict. key => string, value => daftar

323

Saya mendapatkan 'too many values to unpack'kesalahan. Adakah yang bisa saya perbaiki?

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              
tipu
sumber

Jawaban:

478

Python 2

Anda perlu menggunakan sesuatu seperti iteritems.

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

Lihat jawaban ini untuk informasi lebih lanjut tentang iterasi melalui kamus, seperti menggunakan items(), di versi python.

Python 3

Sejak Python 3 iteritems() adalah tidak lagi didukung . Gunakan items()sebagai gantinya.

for field, possible_values in fields.items():
    print(field, possible_values)
Philip Southam
sumber
88
Adapun mengapa Anda perlu melakukan ini, iterasi di kamus iterates melalui kunci, bukan pasangan kunci / nilai.
Jeff Mercado
1
@ jeffm itulah yang membingungkan saya. Saya melihat ini sebagai PHP foreach.
tipu
79

Untuk Python 3.x iteritemstelah dihapus. Gunakan item sebagai gantinya.

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

Anda ingin menggunakan iteritem . Ini mengembalikan iterator ke kamus, yang memberi Anda tuple (kunci, nilai)

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

Masalah Anda adalah bahwa Anda sedang membalik bidang, yang mengembalikan kunci kamus.

>>> for field in fields:
...     print field
... 
first_names
last_name
Mike Lewis
sumber
9

Untuk daftar, gunakan enumerate

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

iteritems tidak akan berfungsi untuk objek daftar

Yordania
sumber
Ini seharusnya jawaban yang benar (diuji) untuk python 2.7 setidaknya.
Kotoran
1

Di Python3 iteritems()tidak lagi didukung

SOLUSI1 :

Menggunakan .items

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

SOLUSI2 :

Anda bisa menggunakannya enumerate()juga

for field, possible_values in enumerate(fields):
    print(field, possible_values)
ishandutta2007
sumber
0

Tidak dapat diulang langsung di kamus. Jadi Anda bisa melalui konversi menjadi 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)
satya narayan pardhi
sumber
Tolong jelaskan jawaban Anda.
Maciej Jureczko
Tidak dapat diulang langsung di kamus. Jadi Anda bisa melalui konversi menjadi tuple.
satya narayan pardhi
0

Anda hilang fields.iteritems()dalam kode Anda.

Anda juga bisa melakukannya dengan cara lain, di mana Anda mendapatkan nilai menggunakan kunci di kamus.

for key in fields:
    value = fields[key]
Vaibhav Desai
sumber
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)
Sakshi
sumber
4
Selamat Datang di Stack Overflow! Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa hal itu menyelesaikan masalah tanpa memperkenalkan orang lain.
Tim Diekmann