1
votes

Index de chaque première valeur vraie en python

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?


0 commentaires

5 Réponses :


2
votes
ret = []
prev = False
for i, x in enumerate(t):
    if x and not prev:
        ret.append(i)
    prev =  x
print(ret)

0 commentaires

0
votes
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)

0 commentaires

-1
votes

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]]


2 commentaires

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!



0
votes

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]


0 commentaires

0
votes

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.


0 commentaires