如何在变量中提取字典单键值对
Posted
技术标签:
【中文标题】如何在变量中提取字典单键值对【英文标题】:How to extract dictionary single key-value pair in variables 【发布时间】:2013-12-07 09:28:28 【问题描述】:我的字典中只有一个键值对。我想将键分配给一个变量 它是另一个变量的值。我尝试了以下方法,但同样出现错误。
>>> 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
我知道我们可以一个一个地提取键和值,或者通过 for 循环和iteritems()
,但是没有一种简单的方法可以在单个语句中分配两者吗?
【问题讨论】:
【参考方案1】:使用元组(只是逗号)添加另一个级别:
(k, v), = d.items()
或使用列表:
[(k, v)] = d.items()
或挑出第一个元素:
k, v = d.items()[0]
前两个具有额外的优势,如果您的字典有多个键,它们会引发异常,并且两者都适用于 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')
【讨论】:
@MartijnPieters,背后的技术解释是什么:(k, v), = d.items()
。我无法理解最后一个逗号。
@dmeu:这是一个元组赋值,逗号makes the left-hand side target a tuple。
@MartijnPieters 右边是什么? :) 我的意思是为什么没有逗号就不行?
@dmeu:为什么不试试? dict.items()
返回一个可迭代的包含 (key, value)
对。您认为 foo = dict.items()
与 foo, = dict.items()
会发生什么?第一个将foo
绑定到dict.items()
返回的任何内容(Python 2 中的列表,Python 3 中的字典视图)。 foo, = dict.items()
将foo
绑定到dict.items()
序列中的第一个元素,如果该序列中有0 个或多个元素,则抛出异常。
@dmeu: (k, v), = d.items()
更进一步。取出第一项,(key, value)
对,并将其分配给 (k, v)
。【参考方案2】:
items()
返回一个元组列表,所以:
(k,v) = d.items()[0]
【讨论】:
Python3 不支持索引【参考方案3】:>>> d = "a":1
>>> [(k, v)] = d.items()
>>> k
'a'
>>> v
1
或者使用next
,iter
:
>>> k, v = next(iter(d.items()))
>>> k
'a'
>>> v
1
>>>
【讨论】:
【参考方案4】:d = "a": 1
你可以的
k, v = d.keys()[0], d.values()[0]
d.keys()
实际上将返回所有键的列表,d.values()
返回所有值的列表,因为您在d
中有一个键:值对,您将访问键和值列表中的第一个元素
【讨论】:
你不能再订阅 dict_keys...你会得到:TypeError: 'dict_keys' object is not subscriptable【参考方案5】:如果字典中有很多项,这是最好的,因为它实际上并没有创建一个列表,而是只产生一个键值对。
k, v = next(d.iteritems())
当然,如果您的字典中有不止一项,则无法知道您会找出哪一项。
【讨论】:
【参考方案6】:在 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)]
【讨论】:
【参考方案7】:你有一个清单。您必须为列表编制索引才能访问元素。
(k,v) = d.items()[0]
【讨论】:
【参考方案8】:如果您只想要字典键而不关心值,请注意 (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)
【讨论】:
【参考方案9】:使用.popitem()
方法。
k, v = d.popitem()
【讨论】:
值得注意的是,popitem
也会从字典中删除键值对。【参考方案10】:
key = list(foo.keys())[0]
value = foo[key]
【讨论】:
以上是关于如何在变量中提取字典单键值对的主要内容,如果未能解决你的问题,请参考以下文章