2013-07-07 18 views
5

Sto cercando di imparare la comprensione del dizionario Python, e penso che sia possibile fare in una riga ciò che fanno le seguenti funzioni. Non ero in grado di creare il n+1 come nel primo o evitare di usare range() come nel secondo.Esempio di comprensione del dizionario Python

È possibile utilizzare un contatore che aumenta automaticamente durante la comprensione, come in test1()?

def test1(): 
    l = ['a', 'b', 'c', 'd'] 
    d = {} 
    n = 1 
    for i in l: 
     d[i] = n 
     n = n + 1 
    return d 

def test2(): 
    l = ['a', 'b', 'c', 'd'] 
    d = {} 
    for n in range(len(l)): 
     d[l[n]] = n + 1 
    return d 
+0

Va bene usare 'range' nella comprensione' dict'? – ersran9

risposta

10

E 'abbastanza semplice utilizzando la funzione di enumerate:

>>> L = ['a', 'b', 'c', 'd'] 
>>> {letter: i for i,letter in enumerate(L, start=1)} 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 

Si noti che, se si voleva la mappatura inversa, cioè la mappatura 1-a, 2-b ecc, si potrebbe semplicemente fare:

>>> dict(enumerate(L, start=1)) 
{1: 'a', 2: 'b', 3: 'c', 4: 'd'} 
1

Questo funziona

>>> l = ['a', 'b', 'c', 'd'] 
>>> { x:(y+1) for (x,y) in zip(l, range(len(l))) } 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 
+0

Grazie, non sapevo 'zip()'. Va bene usare 'range()' all'interno di una comprensione? – stenci

+1

@stenci sicuro, è possibile utilizzare l'intervallo all'interno delle comprensibilità – ersran9

+1

Se non si desidera utilizzare l'intervallo, utilizzare la soluzione di enumerazione di @ Bakuriu. – ersran9

Problemi correlati