it-swarm.com.de

Python mit Aufzählungszeichen innerhalb der Liste

Nehmen wir an, ich habe eine Liste wie diese:

mylist = ["a","b","c","d"]

Um die Werte zusammen mit ihrem Index auszudrucken, kann ich die enumerate-Funktion von Python wie folgt verwenden

>>> for i,j in enumerate(mylist):
...     print i,j
...
0 a
1 b
2 c
3 d
>>>

Wenn ich jetzt versuche, es in einem list comprehension zu verwenden, wird mir dieser Fehler angezeigt

>>> [i,j for i,j in enumerate(mylist)]
  File "<stdin>", line 1
    [i,j for i,j in enumerate(mylist)]
           ^
SyntaxError: invalid syntax

Meine Frage lautet also: Wie verwendet man das Aufzählen von Listeninnern?

110
RanRag

Versuche dies:

[(i, j) for i, j in enumerate(mylist)]

Sie müssen i,j in ein Tuple einfügen, damit das Listenverständnis funktioniert. Da enumerate() bereits ein Tuple zurückgibt, können Sie es auch direkt zurückgeben, ohne es vorher auszupacken:

[pair for pair in enumerate(mylist)]

In jedem Fall wird das Ergebnis wie erwartet zurückgegeben:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
145
Óscar López

Um wirklich klar zu sein, hat dies nichts mit enumerate zu tun und alles mit der Listenverständnissyntax.

Dieses Listenverständnis gibt eine Liste von Tupeln zurück:

[(i,j) for i in range(3) for j in 'abc']

dies ist eine Liste von Diktaten:

[{i:j} for i in range(3) for j in 'abc']

eine Liste von Listen:

[[i,j] for i in range(3) for j in 'abc']

ein Syntaxfehler:

[i,j for i in range(3) for j in 'abc']

Welches ist inkonsistent (IMHO) und verwirrend mit der Syntax für Wörterbuchverständnisse:

>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}

Und ein paar Tupel:

>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])

Wie Óscar López feststellte, können Sie das Aufzählungs-Tuple direkt übergeben:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]
42
the wolf

Oder wenn Sie nicht darauf bestehen, ein Listenverständnis zu verwenden:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
30
pillmuncher

Wenn Sie lange Listen verwenden, scheint das Listenverständnis schneller zu sein, geschweige denn lesbarer.

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop
11
beardc

Hier ist eine Möglichkeit, dies zu tun:

>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Alternativ können Sie Folgendes tun:

>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Der Grund dafür, dass Sie einen Fehler erhalten haben, war, dass Sie die () um i und j verpasst haben, um einen Tuple zu erzeugen.

8
Simeon Visser

Seien Sie explizit über die Tupel.

[(i, j) for (i, j) in enumerate(mylist)]

Alles großartige Antwort Jungs. Ich weiß, dass die Frage hier spezifisch für die Aufzählung ist, aber wie steht es mit so etwas, nur einer anderen Perspektive

from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)

Es wird leistungsfähiger, wenn mehrere Listen parallel in Bezug auf die Leistung durchlaufen werden müssen. Nur ein Gedanke

a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)
0
Pramit

Wie gehe ich vor, wenn die Mylist = ["a", "b", ["x", "y"], "d"]

0
user3347931