2017-10-19 13 views
0

Existe-t-il un moyen d'énumérer dans la compréhension de liste où l'énumération n'augmente que lorsque l'instruction if est True? Par exemple, le code ci-dessous énumère si l'instruction if est True ou False et je voudrais avoir un index continu.Énumération Python à l'aide de la compréhension de liste et de l'instruction

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

J'ai essayé aussi ce qui suit, mais vous ne pouvez pas utiliser passe dans une compréhension de la liste comme ci-dessous.

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

Je vois quelques réponses, mais je ne suis pas sûr que je comprends ce que vous voulez que ouptut. Pouvez-vous donner un exemple de sortie de ce que vous voulez? – RobertB

+0

C'était juste un exemple de jouet, mais je voulais une compréhension de dictionnaire où la valeur incrémente sans sauter des nombres pour indexer les clés. Les réponses ci-dessous fournissent toutes les deux de bonnes façons de mettre en œuvre ce dont j'avais besoin. –

Répondre

2

Il y a. Une façon simple est d'utiliser itertools.count:

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

CEPENDANT: Cela implique de changement d'état dans une liste-compréhension, ce qui est juste ... pas bon. Remarque, si vous exécutez votre compréhension à nouveau, cela aura des conséquences fâcheuses:

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

Au lieu de cela, je ferais quelque chose comme:

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

Que diriez-vous de mettre une liste en compréhension (générateur) dans la compréhension de la liste ?

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

Sorties:

[0, 1] 
+0

hmmm .. peut-être pas ce que vous avez demandé si vous voulez gérer les valeurs none –