Jak przekonwertować listę krotek klucz-wartość na słownik?


125

Mam listę, która wygląda następująco:

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

Chcę przekształcić go w słownik, który wygląda tak:

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

Jak najlepiej to zrobić?

EDYCJA: Moja lista krotek bardziej przypomina:

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

1
Jaki rodzaj tych podmiotów A, B(lub BERA) i C(lub CE) naprawdę są? Dzięki
zjedz

Jestem gotów się założyć, że błędy wywołane poniższymi przykładami roboczymi są związane z tym, że nie ma listy krotek, ale bardzo długą listę, którą chce podzielić na dwie krotki.
gddc,

Odpowiedzi:


90

To daje ten sam błąd, co przy próbie podzielenia listy i spakowania jej. ValueError: element sekwencji aktualizacji słownika # 0 ma długość 1916; 2 jest wymagane

TO jest twoje rzeczywiste pytanie.

Odpowiedź jest taka, że ​​elementy listy nie są tym, za co myślisz. Jeśli wpiszesz myList[0], okaże się, że pierwszy element listy nie jest podwójną krotką, np('A', 1) . Dwiema krotkami, ale raczej iterowalną długością 1916.

Kiedy rzeczywiście mieć listę w postaci wy podanej w oryginalnym pytanie ( myList = [('A',1),('B',2),...]), wszystko co musisz zrobić, to dict(myList).


Dzięki, nie wiem, jak to się stało, ale po przerobieniu jej od nowa udało mi się to naprawić.
Fred Wilson,

1
@DJ_Stuffy_K: (zakładając, że kontekst nie ma związku z tym pytaniem) Ogólnie rzecz biorąc, jeśli nie jest to zbędne lub spowalnia program, tworzenie dykt jako pomocnych indeksów w dowolnej abstrakcyjnej strukturze danych, którą domyślnie budujesz, jest całkowicie w porządku. Pojęcie „dobrej praktyki” jest całkowicie zależne od kontekstu; czy potrzebujesz czasu wyszukiwania kluczy O (1)? Nie możesz też arbitralnie „konwertować list na słowniki”; zależy to całkowicie od semantyki. np. [(1,2), (1,3)]-> {1:3}wyłamałby twoje klucze i straciłby informacje! Dykt jest relacją jeden do * z O (1) czasem wstawiania / usuwania. Lista to lista.
ninjagecko

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

5
Skomentował również inną odpowiedź, która sugeruje to samo: Nie obejmuje to posiadania zduplikowanych „kluczy” krotki, np.: l=[('A',1), ('B',2), ('C',3), ('A', 2)]Spowoduje to, że wynik 'A': 1może nie być pożądany.
guival

32

Czy próbowałeś tego?

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

ValueError: element sekwencji aktualizacji słownika # 0 ma długość 1916; Wymagane jest 2
Fred Wilson,

To była prosta pasta z mojego terminala, więc powinna działać. Czy możesz dokładnie pokazać, co zrobiłeś, aby uzyskać ten błąd?
Bezużyteczne

@Fred, chyba coś źle wpisałeś, ta odpowiedź jest w porządku.
martineau

@FredWilson to jest błąd, który zwykle pojawia się, gdy próbujesz czegoś takiegodict([string1, string2, string3, string4])
chacham15

2
Nie obejmuje to posiadania zduplikowanych „kluczy” krotki, np .: l=[('A',1), ('B',2), ('C',3), ('A', 2)]spowoduje to, że 'A': 1nie będzie to pożądany rezultat.
guival

10

Oto sposób obsługi zduplikowanych „kluczy” krotki:

# 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]}

Niesamowite! Pomogło mi.
unpairestgood

świetnie !, bardzo pomogło
Athar

2

Innym sposobem korzystania ze słownika,

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

2

Jeśli Tuple nie ma kluczowych powtórzeń, jest to proste.

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

Jeśli krotka ma kluczowe powtórzenia.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.