2013-07-07 17 views
5

Ich versuche, Python Wörterbuch Verständnis zu lernen, und ich denke, es ist möglich, in einer Zeile zu tun, was die folgenden Funktionen tun. Ich war nicht in der Lage, die n+1 wie in der ersten oder vermeiden Sie range() wie in der zweiten.Python Wörterbuch Verständnis Beispiel

Ist es möglich, einen Zähler zu verwenden, der automatisch während des Verständnisses inkrementiert, wie 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

Ist es in Ordnung, 'Bereich' im' dict'-Verständnis zu verwenden? – ersran9

Antwort

10

Es ist ganz einfach mit der enumerate Funktion:

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

Beachten Sie, dass, wenn Sie die inverse Abbildung wollte, das heißt Mapping 1-a, 2-b usw., könnten Sie einfach tun:

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

Dies funktioniert

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

Danke, ich kannte 'zip()' nicht. Ist es in Ordnung, 'range()' innerhalb eines Verständnisses zu verwenden? – stenci

+1

@stenci sicher, Sie können den Bereich innerhalb von Comprehensions verwenden – ersran9

+1

Wenn Sie die Entfernung nicht verwenden möchten, verwenden Sie die Enumerationslösung von @ Bakuriu. – ersran9

Verwandte Themen