Распаковать словарь, не зная его ключевого имени

Если у меня есть словарь, как:

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
Другие вопросы по тегам