pregunta iterador Python
-
02-10-2019 - |
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?
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?