'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              

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)

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)

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

9

Untuk daftar, gunakan enumerate

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

iteritems tidak akan berfungsi untuk objek daftar


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)

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)

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]

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
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.