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

问题描述 投票:31回答:8

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

>>> 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(),但是不是一种简单的方法,我们可以在单个语句中分配它们吗?

python python-2.7 dictionary iterable-unpacking
8个回答
63
投票

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

(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')

5
投票

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

(k,v) = d.items()[0]

4
投票
>>> d = {"a":1}
>>> [(k, v)] = d.items()
>>> k
'a'
>>> v
1

或使用nextiter

>>> k, v = next(iter(d.items()))
>>> k
'a'
>>> v
1
>>>

3
投票
    d ={"a":1}

你可以做

    k, v = d.keys()[0], d.values()[0]

d.keys()实际上会返回所有键的列表,而d.values会返回所有值的列表,因为你有一个键:值对,你将访问键和值列表中的第一个元素


2
投票

如果你在字典中有很多项目,这是最好的,因为它实际上并不创建一个列表,而只产生一个键值对。

k, v = next(d.iteritems())

当然,如果你在字典中有多个项目,就无法知道你会得到哪一个。


1
投票

你有一个清单。您必须索引列表才能访问元素。

(k,v) = d.items()[0]

1
投票

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

0
投票

如果您只是想要字典键并且不关心该值,请注意(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)
© www.soinside.com 2019 - 2024. All rights reserved.