在不知道键名的情况下解压字典
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.x和3.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
如果我有像这样的字典:
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.x和3.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