2014-12-04 2 views
5

Ho la seguente lista:Come aggiungere valori nelle chiavi in ​​un dizionario all'interno di un ciclo?

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

Come posso fare il seguente dizionario:

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

ho provato la seguente:

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

Vengono creati i tasti, ma dopo ho problema per inserire i valori. (is_number è una funzione che controlla se il valore della lista è numero o stringa). Primo giorno lontano da MATLAB.Primo giorno in Python ..

risposta

4

Ecco un esempio che utilizza effettivamente la caratteristica che defaultdict fornisce oltre il 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 

Inoltre: è necessario utilizzare i nomi in minuscolo per le istanze di classe. I nomi maiuscoli sono solitamente riservati per le classi. Leggi pep8 per una guida di stile.

1

a patto di avere una chiave sulle prime posizioni della vostra lista (x) e che dopo una lettera, ci sarà un certo numero:

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

Se si inizializza Ogni valore del dizionario con una lista vuota, non è necessario usare 'defaultdict'. – PeterE

+0

@Peter, buon punto. – syntagma

2

È possibile utilizzare 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

Non penso che l'OP volesse 1 o 3 come chiavi. – Kevin

+0

@Kevin sì, mi manca qualcosa che aggiorno, grazie per aver ricordato che – Kasramvd

4

Se le voci chiave/valore nella lista x sono equamente distanziate, ecco un modo alternativo per creare il dizionario. Esso utilizza un paio di Python costruito nelle caratteristiche e funzioni:

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

Per spiegare ciò che è stato utilizzato qui:

  • lista affettare per creare nuovi elenchi da x: x[start:stop:step]
  • qui zip prende due liste e crea un elenco di tuple contenenti gli elementi n-esima di ciascuna lista
  • map(int, pair) trasforma una tupla di stringhe di cifre in un elenco di numeri interi
  • values è costruito con comprensione lista - la funzione map viene applicata a ciascuna coppia
  • dict trasforma una lista di coppie in chiavi del dizionario/valori
+0

sa se i valori sono dinamici ???, come 'a', 1,2, 'b', 4,5,6 ??? – Hackaholic

+1

Questo riguarda solo il caso dell'OP in cui le voci rilevanti sono equamente distanziate. Lo renderò chiaro nella risposta. –

1

Uso itertools.groupby e alcune cose iteratore:

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

Qui il primo iteratore produrrà qualcosa del tipo:

>>> [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]] 

Ora che questo iteratore produce alternativamente valore-chiave, possiamo eseguire il loop su questo iteratore e ottenere il prossimo elemento da esso (i.e il valore) utilizzando 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] 

C'è un altro modo di consumare questo iteratore che utilizza zip, ma è un 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

Soluzione semplice utilizzando solo dict e list:

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