辞書にはキーと値のペアが1つしかありません。キーを1つの変数に割り当て、その値を別の変数に割り当てたい。私は以下の方法で試しましたが、同じエラーが発生しています。
>>> d ={"a":1}
>>> d.items()
[('a', 1)]
>>> (k,v) = d.items()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
>>> (k, v) = list(d.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
キーと値を1つずつ、またはforループとiteritems()で抽出できることは知っていますが、両方を1つのステートメントで割り当てることができる簡単な方法はありませんか?
タプル(カンマのみ)で別のレベルを追加します。
_(k, v), = d.items()
_
またはリスト付き:
_[(k, v)] = d.items()
_
または、最初の要素を選択します。
_k, v = d.items()[0]
_
最初の2つには、辞書に複数のキーがある場合に例外をスローするという利点があり、両方ともPython 3で動作しますが、後者はk, v = next(iter(d.items()))
動作します。
デモ:
_>>> d = {'foo': 'bar'}
>>> (k, v), = d.items()
>>> k, v
('foo', 'bar')
>>> [(k, v)] = d.items()
>>> k, v
('foo', 'bar')
>>> k, v = d.items()[0]
>>> k, v
('foo', 'bar')
>>> k, v = next(iter(d.items())) # Python 2 & 3 compatible
>>> k, v
('foo', 'bar')
_
items()
はタプルのリストを返します:
(k,v) = d.items()[0]
>>> d = {"a":1}
>>> [(k, v)] = d.items()
>>> k
'a'
>>> v
1
または、next
、iter
を使用:
>>> k, v = next(iter(d.items()))
>>> k
'a'
>>> v
1
>>>
d ={"a":1}
できるよ
k, v = d.keys()[0], d.values()[0]
dには単一のkey:valueペアがあるため、キーと値のリストの最初の要素にアクセスするため、d.keys()は実際にすべてのキーのリストを返し、d.valuesはすべての値のリストを返します。
これは、辞書に多くのアイテムがある場合に最適です。実際にリストを作成するのではなく、キーと値のペアが1つだけになるためです。
k, v = next(d.iteritems())
もちろん、辞書に複数のアイテムがある場合、どのアイテムを取り出すかを知る方法はありません。
リストがあります。要素にアクセスするには、リストにインデックスを付ける必要があります。
(k,v) = d.items()[0]
In Python 3 ::
短い答え:
[(k, v)] = d.items()
または:
(k, v) = list(d.items())[0]
または:
(k, v), = d.items()
長い答え:
d.items()は、基本的に(ただし実際にはありません)、2つの値を持つタプルのリストを提供します。これは、印刷すると次のようになります。
dict_items([('a', 1)])
List()でラップすることにより、実際のリストに変換できます。この値は次のようになります。
[('a', 1)]
key = list(foo.keys())[0]
value = foo[key]
辞書キーだけが必要で、値を気にしない場合は、(key, ), = foo.items()
は機能しません。その値を変数に割り当てる必要があります。
したがって、(key, _), = foo.items()
Python 3.7.2:
>>> foo = {'a': 1}
>>> (key, _), = foo.items()
>>> key
'a'
>>> (key, ), = foo.items()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 1)