2016-09-23 2 views
-1

Ich versuche, in Python mit einer sauberen Methode zu tun.Erstellen Sie eine Liste aus einer vorhandenen Liste von Schlüsselwertpaaren in Python

Ich habe eine Liste von Paaren von Buchstaben und Zahlen, die wie folgt aussehen:

[(a,1),(a,2),(a,3),(b,10),(b,100),(c,99),(d,-1),(d,-2)] 

Was ich tun möchte, ist eine neue Liste für jedes Alphabet zu erstellen und alle Zahlenwerte anhängen.

So sollte Ausgabe wie folgt aussehen:

alist = [1,2,3] 
blist = [10,100] 
clist = [99] 
dlist = [-1,-2] 

Gibt es eine saubere Möglichkeit, dies in Python zu tun?

+2

Sie hören über defaultdict? –

+0

@AvinashRaj: Ich nicht. Danke – Piyush

Antwort

2
from collections import defaultdict 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 

if __name__ == '__main__': 
    result = defaultdict(list) 

    for alphabet, number in data: 
     result[alphabet].append(number) 

oder ohne Sammelmodul:

if __name__ == '__main__': 
    result = {} 
    for alphabet, number in data: 
     if alphabet not in result: 
      result[alphabet] = [number, ] 
      continue 
     result[alphabet].append(number) 

Aber ich denke, dass erste Lösung effektiver und klar.

+0

Gibt es eine Möglichkeit, dies auch ohne defaultdict zu tun, falls ich die Sammlungsbibliothek nicht verwenden möchte? – Piyush

+0

ja, natürlich können Sie dies ohne defaultdict tun, siehe bearbeitete Antwort – ShabashP

-1

Sie defaultdict vom collections Modul für diese verwenden:

from collections import defaultdict 

l = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
d = defaultdict(list) 

for k,v in l: 
    d[k].append(v) 

for k,v in d.items(): 
    exec(k + "list=" + str(v)) 
1

Wenn Sie eine defaultdict verwenden vermeiden wollen, aber komfortabel itertools verwenden, können Sie es mit einem

from itertools import groupby 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
grouped = dict((key, list(pair[1] for pair in values)) for (key, values) in groupby(data, lambda pair: pair[0])) 
# gives {'b': [10, 100], 'a': [1, 2, 3], 'c': [99], 'd': [-1, -2]} 
Einzeiler tun können
+0

Ich habe tatsächlich mein eigenes Wörterbuch implementiert. Aber trotzdem danke – Piyush

0

Nachdem ich die Antworten im Thread gesehen und die Implementierung von defaultdict gelesen hatte, implementierte ich meine eigene Version, da ich die Collections-Bibliothek nicht verwenden wollte.

mydict = {} 
    for alphabet, value in data: 
     try: 
      mydict[alphabet].append(value) 
     except KeyError: 
      mydict[alphabet] = [] 
      mydict[alphabet].append(value) 
Verwandte Themen