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?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top