Pregunta

Tengo esta lista:

names = ['john','Jonh','james','James','Jardel']

Quiero bucle sobre la lista y manejar nombres consecutivos con un partido de mayúsculas y minúsculas en la misma iteración. Así, en la primera iteración me gustaría hacer algo with'john' y 'John' y quiero la siguiente iteración para empezar a 'James'.

No se puede pensar en una manera de hacer por este bucle utilizando Python, alguna sugerencia?

¿Fue útil?

Solución

Esto sería una para itertools.groupby, que grupos de elementos iguales consecutivos a partir de una lista o de otro iterable. puede especificar una función para hacer la comparación, por lo que, en su caso, el mismo nombre en diferentes casos todavía puede ser considerado como la misma cosa.

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

Otros consejos

names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
    print name, capitalized_name

Tenga en cuenta que lo que necesita la misma cantidad de artículos para que esto funcione correctamente.

O (tal vez mejor, difícil decir con poco contexto) utilizar un set para filtrar la lista para contener sólo nombres únicos (nota que este pierde orden):

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

Sólo podría utilizar un bucle 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

O usted está buscando algo un poco más complicado?

A medida que iterar a través del bucle, podría intentar hacer el seguimiento del nombre anterior de la lista. Al mismo tiempo, cuando se va a almacenar los nombres, se puede hacer una llamada a bajar () o capitalizar () para hacer que el formato del nombre de cada coherente, de modo que se puede comparar sean más fáciles.

por ejemplo.

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()

Puede que no sea el más eficiente, pero funciona.

Mi $ 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)

No estoy seguro de haber entendido la pregunta exactamente; ¿Qué está tratando de lograr?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top