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

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

或者使用nextiter

>>> 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]

【讨论】:

以上是关于如何在变量中提取字典单键值对的主要内容,如果未能解决你的问题,请参考以下文章

从字典中提取键值对的子集?

Python字典键值对的添加和遍历

字典——python基础篇

如何在python中打印字典的键值对

如何将键值对添加到字典中? [复制]

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?