在不知道键名的情况下解压字典

Unpack dictionary without knowledge of its key name

如果我有像这样的字典:

d = {'keyname': ['foo', 'bar']}

而且我不知道键名如何将这个字典解压成两个变量?

这行不通:

k,v = d

我可以像这样迭代这个字典:

for k, v in d.items():
    # k and v are now available

但我认为这还不够 "pythonic"

如何在不使用 for 循环的情况下执行此操作?

"d" 总是只能有一对 key:val

在Python2.x 如果您的 dictionary 总是长度为 1,那么这可能是一种可能的解决方案:

>>> d = {'keyname': ['foo', 'bar']}
>>> k, v = d.keys()[0], d.values()[0]
>>> k
'keyname'
>>> v
['foo', 'bar']

Python2.x3.x 使用 .items()

>>> k, v = d.items()[0]
>>> k
'keyname'
>>> v
['foo', 'bar']

对于python3.x

>>> d = {'keyname': ['foo', 'bar']}
>>> k, v = tuple(d.keys())[0], tuple(d.values())[0]
>>> k
'keyname'
>>> v
['foo', 'bar']

您可以使用可迭代解包:

>>> d = {'keyname': ['foo', 'bar']}
>>> [(k, v)] = d.items()
>>> k
'keyname'
>>> v
['foo', 'bar']
>>>

这适用于 Python 2.x 和 Python 3.x。

但是请注意,如果您使用 Python 2.x,使用 d.iteritems()d.items():

效率会稍微高一些
>>> from timeit import timeit
>>> d = {'keyname': ['foo', 'bar']}
>>> timeit('[(k, v)] = d.items()', 'from __main__ import d')
0.786108849029695
>>> timeit('[(k, v)] = d.iteritems()', 'from __main__ import d')
0.6730112346680928
>>>

这是因为 iteritems returns 一个迭代器,而 items 构建了一个不必要的列表。

d = {'keyname': ['foo', 'bar']}

对于 d.keys() 中的 k: 键 = k

val = d[k]

print key, val