Распаковать словарь, не зная его ключевого имени
Если у меня есть словарь, как:
d = {'keyname': ['foo', 'bar']}
и я не знаю имя ключа, как бы я распаковал этот dict в две переменные?
Это не работает:
k,v = d
Я мог бы повторить это, как:
for k, v in d.items():
# k and v are now available
Но я думаю, что это не "питонический" способ
Как я могу сделать это без использования цикла for?
"d"
всегда может иметь только ОДИН key:val
пара.
3 ответа
Вы можете использовать повторяемую распаковку:
>>> 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
возвращает итератор, а items
строит ненужный список.
В Python 2.x Если ваш dictionary
всегда будет иметь длину 1, тогда это может быть одним из возможных решений:
>>> d = {'keyname': ['foo', 'bar']}
>>> k, v = d.keys()[0], d.values()[0]
>>> k
'keyname'
>>> v
['foo', 'bar']
Для Python 2.x и 3.x Использование .items()
>>> k, v = d.items()[0]
>>> k
'keyname'
>>> v
['foo', 'bar']
Для Python 3.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 в d.keys(): ключ = k
val = d[k]
print key, val