Je veux juste renvoyer une liste de toutes les premières valeurs True et leur position. Ici, "on" sera égal à True et "off" égal à False
[4, 5, 6, 9, 10, 11, 12, 20, 21, 22]
La réponse devrait être une liste
[i for i, x in enumerate(t) if x]
J'ai essayé le code suivant:
[4, 9, 20]
Ceci renvoie
t = [False, False, False, False, True, True, True, False, False,
True, True, True, True, False, False, False, False, False,
False, False, True, True, True, False]
Y a-t-il un moyen de le faire?
5 Réponses :
ret = []
prev = False
for i, x in enumerate(t):
if x and not prev:
ret.append(i)
prev = x
print(ret)
t = [False, False, False, False, True, True, True, False, False,
True, True, True, True, False, False, False, False, False,
False, False, True, True, True, False]
indexes = []
counter = 0
for i in range(0, len(t)):
el = t[i]
if counter == 0:
if el:
indexes.append(i)
counter = i
else:
if (el == True) and (i - counter == 1):
indexes.append(i)
counter = i
else:
break
print(indexes)
Vous y êtes presque:
[i for i, x in enumerate(t) if x and (x != (t[i-1] if i > 0 else False))]
Modifier après un bon commentaire: (je veux dire, ça peut quand même être une ligne)
[i for i, x in enumerate(t) if x and x != t[i-1]]
Soyez prudent avec cela, car la première valeur devrait être vraie, i-1 équivaudrait à -1. Par conséquent, t [-1] prendrait le dernier élément de la liste d'entrée.
Ah, c'est pourquoi il a été testé positif ... Merci!
Si vous êtes d'accord avec le module tiers pandas
defaultdict(list, {False: [0, 7, 13,23], True: [4, 9, 20]})
Une autre solution sans pandas utilisant defaultdict
from collections import defaultdict
d=defaultdict(list)
prev=t[0]
d[prev].append(0)
for idx,element in enumerate(t[1:],1):
if element!=prev:
d[element].append(idx)
prev=element
print(d)
Résultat:
import pandas as pd
t = [False, False, False, False, True, True, True, False, False,
True, True, True, True, False, False, False, False, False,
False, False, True, True, True, False]
s=pd.Series(t)
s = s.loc[s==True][s.shift(+1) != s]
Si vous voulez un one-liner:
on_list = [i for i, x in enumerate(t) if x and not (i and t[i-1])] print(on_list)
Cependant, dans ce cas, il n'y a aucune raison d'utiliser un one-liner pour le rendre trop complexe à lire.