Як перетворити список ключових значень кортежів у словник?


125

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

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

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

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

Який найкращий шлях для цього?

EDIT: Мій список кортежів насправді більше схожий на:

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

1
Які особи тих A, B(або BERA) і C(або CE) на насправді? Спасибі
їмо

Я готовий зробити ставку, що помилки, викладені в наведених нижче робочих прикладах, пов’язані з тим, що він не має списку кортежів, а надзвичайно довгий список, який він хоче розділити на два кортежі.
gddc

Відповіді:


90

Це дає мені таку саму помилку, що і спроба розділити список і скопіювати його. ValueError: елемент послідовності оновлення словника № 0 має довжину 1916; 2 потрібно

ЩО ТВОЕ власне питання.

Відповідь полягає в тому, що елементи вашого списку - це не те, що, на вашу думку, є. Якщо ви введете текст, myList[0]ви побачите, що перший елемент вашого списку - це не дві форми, наприклад ('A', 1), це ітерабельність довжиною 1916 року.

Після того, як у вас є фактично список у формі, яку ви вказали у своєму первісному запитанні ( myList = [('A',1),('B',2),...]), все, що вам потрібно зробити, - це dict(myList).


Дякую, я не знаю, як список став таким, але переробивши його з нуля, я зміг його виправити.
Фред Вілсон

1
@DJ_Stuffy_K: (якщо припустити, що контекст не пов'язаний з цим питанням) Взагалі, якщо це не зайве або не сповільнить вашу програму, цілком чудово створювати дикти як корисні індекси в будь-якій абстрактній структурі даних, яку ви неявно будуєте. Поняття "хороша практика" повністю залежить від контексту; чи потрібен час (1) пошуку ключів O (1)? Також ви не можете "конвертувати списки в словники" довільно; це повністю залежить від семантики. напр. [(1,2), (1,3)]-> {1:3}розгубить ваші ключі і втратить інформацію! Диктат - це відношення "один до *" з часом вставки / видалення 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що це може бути не бажаним результатом.
відвід

32

Ви пробували це?

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

ValueError: елемент послідовності оновлення словника № 0 має довжину 1916; 2 потрібно
Фред Вілсон

Це був прямий виріз від мого терміналу, тож він повинен працювати. Чи можете ви точно показати, що ви зробили, щоб отримати цю помилку?
Марно

@Fred, ви повинні щось помилково ввести, ця відповідь чудова.
martineau

@FredWilson - це помилка, яку ви зазвичай отримуєте при спробі чогось подібногоdict([string1, string2, string3, string4])
chacham15

2
Це не охоплює повторюваних кортежних "ключів", наприклад: l=[('A',1), ('B',2), ('C',3), ('A', 2)]це призведе до отримання, 'A': 1який може бути не бажаним результатом.
гайва

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

чудово !, допомагав багато
Athar

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.