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.
4 Réponses :
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
Si vous le souhaitez pour chaque élément de votre liste, enveloppez-le dans une boucle for.
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
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
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]))
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.