2017-09-15 4 views
2

Cela semble assez facile mais je suis un peu coincé sur celui-ci.
J'ai une liste de valeurs logiques, par exemple:Python - Liste des indices d'éléments d'une autre liste qui correspondent à une condition

a=[True, False, True, True, False, False, True, True, True] 

et je veux construire une autre liste contenant (en sous-listes) les indices de « a » qui sont « Vrai », avec des indices successifs mis en la même sous-liste. Ainsi, pour l'exemple ci-dessus, la réponse serait:

[[0], [2,3], [6,7,8]] 

Répondre

6

En utilisant itertools.groupby et enumerate, une seule ligne est possible:

from itertools import groupby 
[[i for i, _ in g] for k, g in groupby(enumerate(a), key=lambda x: x[1]) if k] 
0

Dans la même veine,

>>> a = [True, False, True, True, False, False, True, True, True] 
>>> from itertools import groupby 
>>> [list(v) for k,v in groupby([_ if a[_] else None for _ in range(len(a)) ], lambda x: not x is None) if k] 
[[0], [2, 3], [6, 7, 8]] 
0

pur Python, pas de bibliothèques:

a=[True, False, True, True, False, False, True, True, True] 

indcs = [i for i, b in enumerate(a) if b] 

if indcs: 
    o, s = [], [indcs[0]] 
    for a, b in zip(indcs, indcs[1:] + [indcs[-1]]): 
     if b-a == 1: 
      s.append(b) 
     else: 
      o.append(s) 
      s = [b] 
else: 
    o = [] 

o  
Out[32]: [[0], [2, 3], [6, 7, 8]]