2017-10-19 2 views
0

Gibt es eine Möglichkeit zum Auflisten im Listenverständnis, wo die Enumeration nur dann inkrementiert wird, wenn die if-Anweisung True ist?Python-Enumeration mit List Comprehension und If-Anweisung

Zum Beispiel führt der folgende Code auf, ob die if-Anweisung True oder False ist und ich möchte einen kontinuierlichen Index haben.

my_list = [0,1,2] [i for i, w in enumerate(my_list) if w != 1]

Ich habe auch versucht die folgenden, aber Sie können nicht weiter in einer Liste Verständnis wie unten.

[i if w != 1 else pass for i, w in enumerate(my_list)] 
+1

Ich sehe ein paar Antworten, aber ich bin nicht sicher, ob ich verstehe, was Sie als ouptut wollen. Können Sie eine Beispielausgabe von dem geben, was Sie wollen? – RobertB

+0

Dies war nur ein Spielzeugbeispiel, aber ich wollte ein Wörterbuch Verständnis, wo der Wert erhöht, ohne Zahlen zu überspringen, um die Schlüssel zu indexieren. Die Antworten unten bieten beide gute Möglichkeiten, das zu implementieren, was ich brauchte. –

Antwort

2

Es gibt. Eine einfache Möglichkeit ist itertools.count zu verwenden:

>>> from itertools import count 
>>> c = count(0) 
>>> my_list = [0,1,2] 
>>> [next(c) for w in my_list if w != 1] 
[0, 1] 

JEDOCH: Hierbei handelt es state-Änderung in einer Liste-Verständnis, das gerade ist ... nicht gut. Beachten Sie, wenn Sie wieder Ihr Verständnis führen, diese unglückliche Auswirkungen haben:

>>> [next(c) for w in my_list if w != 1] 
[2, 3] 
>>> [next(c) for w in my_list if w != 1] 
[4, 5] 

Stattdessen möchte ich etwas tun:

>>> range(sum(w != 1 for w in my_list)) 
range(0, 2) 
1

Wie über eine Liste Verständnis (Generator) in der Liste Verständnis setzen ?

my_list = [0,1,2] 
[i for i, w in enumerate((_ for _ in my_list if _ != 1)) ] 

Ausgänge:

[0, 1] 
+0

hmmm .. vielleicht nicht das, was Sie gefragt haben, wenn Sie die keine Werte behandeln wollen –

Verwandte Themen