Список кортежів до словника


112

Ось як я зараз перетворюю список кортежів у словник на Python:

l = [('a',1),('b',2)]
h = {}
[h.update({k:v}) for k,v in l]
> [None, None]
h
> {'a': 1, 'b': 2}

Чи є кращий спосіб? Здається, що для цього повинен бути один лайнер.

Відповіді:


179

Просто зателефонуйте dict()до списку кортежів безпосередньо

>>> my_list = [('a', 1), ('b', 2)]
>>> dict(my_list)
{'a': 1, 'b': 2}

1
Дерп, я знав, що це буде простий спосіб зробити це ... Приїжджаючи з Рубі сюди, намагаюся навчитися Python-способу ведення справ. Дякую!
Sarah Vessels

5
@chandresh Це робить роботу в Python 3, тому не потрібно оновлення.
Свен Марнах

@SvenMarnach, ось мій вихід тієї самої команди, яку ви написали вище на терміналі py 3.5. Traceback (останній дзвінок останній): Файл "<ipython-input-313-7bb3559567ff>", рядок 1, у <module> dict (my_list) TypeError: "Словник" об'єкт не може викликати
CKM

4
@chandresh Це не має нічого спільного з Python 3 - це тому, що у вас є названа змінна dict, затінюючи однойменну вбудовану програму Python. Ти ніколи цього не повинен робити.
Свен Марнах

@SvenMarnach О. Дякую. Це спрацювало. Насправді я дістав якийсь код з Інтернету і спробував це запустити. Схоже, автор використав dictяк ім'я змінної, звідки я отримав помилку. Знову дякую.
CKM

23

dictКонструктор приймає вхідні дані точно так , як у вас є (ключ / значення кортежів).

>>> l = [('a',1),('b',2)]
>>> d = dict(l)
>>> d
{'a': 1, 'b': 2}

Від документації :

Наприклад, усі вони повертають словник, рівний {"one": 1, "two": 2}:

dict(one=1, two=2)
dict({'one': 1, 'two': 2})
dict(zip(('one', 'two'), (1, 2)))
dict([['two', 2], ['one', 1]])

15

З dictрозумінням:

h = {k:v for k,v in l}

4
приємно, тому що дозволяє робити форматування на ключ / значення перед тим, як додати його до
дикту

7

Здається, всі тут припускають, що список кортежів має один до одного зіставлення між ключем та значеннями (наприклад, у ньому немає дублюваних ключів для словника). Оскільки це перше запитання, яке з'являється в пошуку цієї теми, я публікую відповідь на більш загальний випадок, коли нам доводиться мати справу з дублікатами:

mylist = [(a,1),(a,2),(b,3)]    
result = {}
for i in mylist:  
   result.setdefault(i[0],[]).append(i[1])
print(result)
>>> result = {a:[1,2], b:[3]}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.