1
votes

Existe-t-il un meilleur moyen de vérifier la valeur modifiée en séquence?

J'ai une liste comme ci-dessous:

history = list[0]
number_A = 0
number_B = 0
for i in list:
    if history != i:
        break

    if i == 'A':
        number_A += 1
        history = 'A'
    else:
        number_B += 1
        history = 'B'

Et, je veux compter le numéro de la première valeur (dans le cas ci-dessus, 'A') consécutivement avant que les autres valeurs ('B') viennent.

J'ai donc écrit un code comme:

list = ['A', 'A', 'B', 'A', 'B', 'A', 'B']

Cependant, je pense que c'est très désordonné. Existe-t-il un moyen plus simple de faire ce processus?

Merci d'avoir lu.


2 commentaires

Peut-il y avoir plus de valeurs ou juste A et B?


Si 'A' et 'B' sont les seules valeurs possibles, alors .index ('B') est la réponse. Ceci renvoie la position de liste du premier 'B' , et donc tous les caractères précédents seront des 'A' consécutifs.


4 Réponses :


2
votes

Vous pouvez utiliser take while:

from itertools import takewhile

my_list = ['A', 'A', 'B', 'A', 'B', 'A', 'B']

res = takewhile(lambda x: x == my_list[0], my_list)
print(len(list(res)))

SORTIE: 2


1 commentaires

Si vous le souhaitez pour chaque élément de votre liste, enveloppez-le dans une boucle for.



5
votes

Utilisation de groupby avec la fonction clé par défaut, vous pouvez compter le nombre d'éléments dans le premier groupeur:

from itertools import groupby

def count_first(lst):
    if not lst:
        return 0
    _, grouper = next(groupby(lst))
    return sum(1 for _ in grouper)

print(count_first(['A', 'A', 'B', 'A', 'B', 'A', 'B']))  
# 2


0 commentaires

1
votes

J'ai renommé votre liste en lst afin de ne pas remplacer le nom intégré list.

>>> lst = ['A', 'A', 'B', 'A', 'B', 'A', 'B']
>>> string = ''.join(lst)
>>> len(string) - len(string.lstrip('A'))
2


0 commentaires

3
votes

Il n'y a aucune raison d'utiliser la clause "else", vous n'allez pas compter les "B" puisque vous allez vous casser avant d'y arriver.

lst = ['A', 'A', 'B', 'A', 'B', 'A', 'B']

count = 0

for i in lst:
    if i != lst[0]:
        break
    count += 1

print("list starts with %d of %s's" % (count, lst[0]))


0 commentaires