2014-12-04 3 views
5

Ich habe die folgende Liste:Wie können Werte in Schlüsseln in einem Wörterbuch innerhalb einer Schleife hinzugefügt werden?

x=['a','3','4','b','1','2','c','4','5'] 

Wie kann ich die folgende Wörterbuch machen:

b = {'a':[3,4],'b':[1,2],'c':[4,5]} 

ich folgendes versucht:

Category = defaultdict(int) 
for i in a: 
    if Varius.is_number(i)==False: 
     Category[i]=[] 
     keys.append(i) 
    else: 
     Category[keys(i)] = i 

Die Schlüssel erstellt werden, aber nachdem ich Problem, um die Werte einzufügen. (is_number ist eine Funktion, die überprüft, ob der Wert der Liste Nummer oder Zeichenfolge ist). Erster Tag weg von MATLAB.First Tag in Python ..

Antwort

4

Hier ein Beispiel, das tatsächlich die Funktion verwendet, dass defaultdict bietet über die normale dict:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key='<unknown>' # needed if the first value of x is a number 
category = defaultdict(list) # defaultdict with list 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     category[key].append(i) # no need to initialize with an empty list 

print category 

Auch: Sie sollten Kleinbuchstaben Namen für Klasseninstanzen verwenden. Großbuchstaben sind normalerweise für Klassen reserviert. Lesen Sie pep8 für einen Style Guide.

1

Angenommen, Sie eine Taste auf den ersten Positionen der Liste haben (x) und dass nach einem Brief, es wird eine Zahl sein:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key = x[0] 
Category = defaultdict(int) 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     Category[key].append(i) 

print Category 
+0

Wenn Sie initialisieren Wenn jeder Wörterbuchwert eine leere Liste enthält, ist es nicht erforderlich, 'defaultdict' zu verwenden. – PeterE

+0

@Peter, guter Punkt. – syntagma

2

können Sie verwenden itertools.groupby:

>>> from itertools import groupby 
>>> l=[list(g) for k,g in groupby(x,lambda x : x.isalpha())] 
>>> p=[l[i:i+2] for i in range(0,len(l),2)] 
>>> {i[0]:map(int,j) for i,j in p} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
+0

Ich glaube nicht, dass das OP 1 oder 3 Schlüssel wollte. – Kevin

+0

@Kevin ja, ich vermisse etwas, ich werde aktualisieren, danke für die Erinnerung – Kasramvd

4

Wenn die Schlüssel/Wert-Einträge in Ihrer Liste x gleichmäßig verteilt sind, ist hier eine alternative Möglichkeit zum Erstellen des Wörterbuchs. Es verwendet ein paar von Pythons eingebauten Features und Funktionen:

>>> keys = x[::3] 
>>> values = [map(int, pair) for pair in zip(x[1::3], x[2::3])] 
>>> dict(zip(keys, values)) 
{'a': [3, 4], 'b': [1, 2], 'c': [4, 5]} 

Um zu erklären, was hier verwendet wird ist:

Slicing
  • Liste neue Listen von x zu erstellen: x[start:stop:step]
  • hier zip nimmt zwei Listen und macht eine Liste von Tupeln, die n-te Elemente jeder Liste
  • map(int, pair) schaltet sich ein Tupel von Ziffernfolgen in eine Liste von ganzen Zahlen
  • enthält
  • values mit Liste Verständnis aufgebaut ist - die map Funktion zu jedem
  • Paar angelegt wird dict dreht eine Liste von Paaren in Dictionary-Schlüssel/Wert
+0

wahat über wenn Werte dynamisch sind ???, wie 'a', 1,2, 'b', 4,5,6 ??? – Hackaholic

+1

Dies betrifft nur den Fall des OP, in dem die relevanten Einträge gleichmäßig verteilt sind. Ich werde das in der Antwort klarstellen. –

1

itertools.groupby und einige Iterator Sachen verwenden:

>>> from itertools import groupby 
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> {k: next(it) for k in it} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 

Hier liefert der erste Iterator etwa Folgendes:

>>> [next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)] 
['a', [3, 4], 'b', [1, 2], 'c', [4, 5]] 

Nun, da dieser Iterator abwechselnd den Schlüsselwert liefert, können wir diesen Iterator durchlaufen und das nächste Element daraus holen (d. H.e der Wert) unter Verwendung von next()

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> for k in it:                
    print k,'-->' ,next(it) 
...  
a --> [3, 4] 
b --> [1, 2] 
c --> [4, 5] 

Es gibt einen anderen Weg, um diese Iterator zu konsumieren, die zip verwendet, aber es ist ein little hard to understand IMO:

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> dict(zip(*[it]*2)) 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
0

Einfache Lösung nur dict und list mit:

>>> category = {} 
>>> for i in x: 
...  if i.isalpha(): 
...   items = category[i] = [] 
...  elif category: 
...   items.append(i) 
... 
>>> print(category) 
{'c': ['4', '5'], 'a': ['3', '4'], 'b': ['1', '2']} 
Verwandte Themen