Domanda

Ho questa lista:

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

Voglio loop all'interno di una lista e gestire nomi consecutivi con una tra maiuscole e minuscole nella stessa iterazione. Così nella prima iterazione vorrei fare qualcosa with'john' e 'John' e voglio la prossima iterazione per iniziare a 'James'.

Non riesco a pensare a un modo di fare per questo ciclo utilizzo di Python, qualche suggerimento?

È stato utile?

Soluzione

Questo sarebbe uno per itertools.groupby, quali gruppi elementi uguali consecutivi da un elenco o altro iterabile. è possibile specificare una funzione per fare il confronto, in modo che, nel tuo caso, lo stesso nome in diversi casi può ancora essere considerato come la stessa 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

Altri suggerimenti

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

Si noti che è necessario una quantità ancora di elementi per far funzionare correttamente.

O (forse meglio; difficile dire con poco contesto) utilizzare un set per filtrare l'elenco per contenere i nomi solo univoci (nota che questo ordine perde):

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

si potrebbe utilizzare un ciclo 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

Oppure cercate qualcosa di un po 'più complesso?

Come si iterate attraverso il ciclo, si potrebbe provare a tenere traccia del nome precedente nell'elenco. Allo stesso tempo, in cui si sta andando a memorizzare i nomi, è possibile effettuare una chiamata per abbassare () o capitalizzare () per rendere la formattazione di ogni nome di costante in modo da poter confrontare più facili.

per es.

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

potrebbe non essere il più efficiente, ma funziona.

Il mio $ 0.02 Filter:

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)

Non sono sicuro di aver capito la domanda esattamente; Che cosa stai cercando di realizzare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top