question Python iterator
-
02-10-2019 - |
Question
Je cette liste:
names = ['john','Jonh','james','James','Jardel']
Je veux boucle sur la liste et gérer les noms consécutifs avec une correspondance insensible cas dans la même itération. Ainsi, dans la première itération je ferais quelque chose with'john » et « John » et je veux la prochaine itération pour commencer à « James ».
Je ne peux pas penser à une façon de faire pour la boucle de cela en utilisant Python, des suggestions?
La solution
Ce serait une pour itertools.groupby
, qui regroupe des éléments égaux consécutifs à partir d'une liste ou d'un autre iterable. vous pouvez spécifier une fonction pour faire la comparaison, de sorte que, dans votre cas, le même nom dans différents cas peut encore être considéré comme la même chose.
for k, g in itertools.groupby(names, lambda s: s.lower()):
# Example: in the first iteration:
# k = "john"
# g = an iterator over ["john", "John"]
# Process them as you like
Autres conseils
names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
print name, capitalized_name
Notez que vous avez besoin d'une quantité encore d'éléments pour que cela fonctionne correctement.
Ou (peut-être mieux, difficile de dire avec peu de contexte) utiliser un set
pour filtrer la liste pour ne contenir que des noms uniques (notez que cette commande perd):
>>> names = ['john','John','james','James','Jardel']
>>> unique_names = set([x.lower() for x in names])
>>> for unique_name in unique_names:
... print unique_name
...
jardel
james
john
Vous pouvez simplement utiliser une boucle while
:
i = 0
while i < len(names):
# compare names[i] with names[i + 1]
i = i + 2 # or + 1 if names not equal, for example
Vous cherchez quelque chose d'un peu plus impliqué?
Comme vous itérer à travers la boucle, vous pouvez essayer de garder la trace du nom précédent dans la liste. En même temps, quand vous allez stocker les noms, vous pouvez faire un appel à la baisse () ou capitaliser () pour rendre cohérente la mise en forme de chaque nom afin que vous puissiez les comparer plus facilement.
par exemple.
first = True
prev= ""
for name in names:
if first: #First iteration
prev = name.lower() #Need to get the first elem
do_something_to(curr)
first = False
else:
if prev == name.lower():
print "do nothing"
else:
do_something_to(curr)
prev = name.lower()
ne soit pas la plus efficace, mais fonctionne.
Mon 0,02 $:
def byPairs(li):
for i in xrange(1, len(li), 2):
yield (li[i-1], li[i])
for a,b in byPairs(names):
if a.lower()==b.lower():
doSomething(a,b)
Je ne suis pas sûr d'avoir compris la question exactement; ce que vous essayez d'accomplir?