Как преобразовать список кортежей ключ-значение в словарь?


125

У меня есть список, который выглядит так:

[('A', 1), ('B', 2), ('C', 3)]

Я хочу превратить его в словарь, который выглядит так:

{'A': 1, 'B': 2, 'C': 3}

Как лучше всего это сделать?

РЕДАКТИРОВАТЬ: Мой список кортежей на самом деле больше похож:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
Что это за сущности A, B(или BERA) и C(или CE) на самом деле? Спасибо
ешь

Я готов поспорить, что ошибки, возникающие в приведенных ниже рабочих примерах, связаны с тем, что у него нет списка кортежей, а есть чрезвычайно длинный список, который он хочет разделить на 2 кортежа.
gddc 05

Ответы:


90

Это дает мне ту же ошибку, что и попытка разделить список и заархивировать его. ValueError: элемент # 0 последовательности обновления словаря имеет длину 1916; 2 требуется

ЭТО ваш актуальный вопрос.

Ответ заключается в том, что элементы вашего списка не такие, как вы думаете. Если вы введете, myList[0]вы обнаружите, что первый элемент вашего списка не является двухкортежным, например ('A', 1), а, скорее, итерируемым элементом длиной 1916.

Когда у вас действительно есть список в той форме, которую вы указали в исходном вопросе ( myList = [('A',1),('B',2),...]), все, что вам нужно сделать, это сделать dict(myList).


Спасибо, я не знаю, как список стал таким, но, переработав его с нуля, я смог это исправить.
Fred Wilson

1
@DJ_Stuffy_K: (при условии, что контекст не имеет отношения к этому вопросу) В общем, если он не является излишним или замедляет вашу программу, вполне нормально создавать словари в качестве полезных индексов в любую абстрактную структуру данных, которую вы неявно строите. Понятие «передовой опыт» полностью зависит от контекста; вам нужно время поиска O (1) для ключей? Также вы не можете произвольно «конвертировать списки в словари»; это полностью зависит от семантики. например [(1,2), (1,3)]-> {1:3}ваши ключи сбиваются и информация теряется! Dict - это отношение один-к * с временем вставки / удаления O (1). Список - это список.
ninjagecko

162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
Также прокомментировал другой ответ, который предлагает то же самое: это не касается наличия повторяющихся «ключей» кортежа, например: l=[('A',1), ('B',2), ('C',3), ('A', 2)]приведет к тому, 'A': 1что это может быть не желаемым результатом.
Guival

32

Вы пробовали это?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: элемент # 0 последовательности обновления словаря имеет длину 1916; Требуется 2
Fred Wilson

Это была прямая резка с моего терминала, так что она должна работать. Можете ли вы показать, что именно вы сделали, чтобы получить эту ошибку?
Бесполезный

@ Фред, ты, должно быть, что-то напечатал, это нормально.
Мартино 05

@FredWilson, это ошибка, которую вы обычно получаете, когда пытаетесь что-то вродеdict([string1, string2, string3, string4])
chacham15

2
Это не относится к дублированию «ключей» кортежа, например: l=[('A',1), ('B',2), ('C',3), ('A', 2)]приведет к получению, 'A': 1что может быть не желаемым результатом.
Guival

10

Вот способ обработки повторяющихся «ключей» кортежа:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

Потрясающие! Выручил меня.
unpairestgood 05

отлично !, очень помог
Атар

2

Другой способ использования словарных пониманий,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}

2

Если в Tuple нет повторений ключей, это просто.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Если в кортеже есть повторения ключей.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.