如何在变量中提取字典单键值对

34 python dictionary python-2.7 iterable-unpacking

我在字典中只有一个键值对.我想将键分配给一个变量,将它的值分配给另一个变量.我尝试过以下方式,但我得到的错误相同.

>>> 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
Run Code Online (Sandbox Code Playgroud)

我知道我们可以逐个提取键和值,或者通过for循环和iteritems(),但是不是一种简单的方法,我们可以在单个语句中分配它们吗?

Mar*_*ers 68

添加另一个级别,带有元组(只是逗号):

(k, v), = d.items()
Run Code Online (Sandbox Code Playgroud)

或列表:

[(k, v)] = d.items()
Run Code Online (Sandbox Code Playgroud)

或挑出第一个元素:

k, v = d.items()[0]
Run Code Online (Sandbox Code Playgroud)

前两个具有额外的优势,如果你的字典有多个键,它们会抛出异常,并且两者都可以在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')
Run Code Online (Sandbox Code Playgroud)

  • @dmeu:为什么不试试*?`dict.items()`返回一个包含*`(key,value)`对的可迭代*.您认为`foo = dict.items()`与`foo,= dict.items()`会发生什么?第一个将`foo`绑定到任何`dict.items()`返回(Python 2中的列表,Python 3中的字典视图).`foo,= dict.items()`将`foo`绑定到`dict.items()`序列中的*first元素*,如果该序列中有0个或多个元素,则抛出异常. (4认同)
  • @dmeu:`(k,v),= d.items()`只需更进一步.取第一项,一个`(key,value)`对,并将其分配给`(k,v)`. (3认同)
  • @MartijnPieters,背后的技术解释是什么:`(k,v),= d.items()`.我无法理解最后一个逗号. (2认同)

Far*_*dix 5

items() 返回一个元组列表,所以:

(k,v) = d.items()[0]
Run Code Online (Sandbox Code Playgroud)

  • Python3不支持索引 (5认同)

fal*_*tru 5

>>> d = {"a":1}
>>> [(k, v)] = d.items()
>>> k
'a'
>>> v
1
Run Code Online (Sandbox Code Playgroud)

或使用next, iter

>>> k, v = next(iter(d.items()))
>>> k
'a'
>>> v
1
>>>
Run Code Online (Sandbox Code Playgroud)