Python итератор вопрос - PullRequest
       23

Python итератор вопрос

1 голос
/ 03 мая 2010

У меня есть этот список:

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

Я хочу перебрать список и обработать последовательные имена с учетом без учета регистра в одной и той же итерации. Итак, в первой итерации я что-то делал с 'john' и 'John', и я хочу, чтобы следующая итерация начиналась с 'james'.

Я не могу придумать, как сделать это с помощью цикла for Python, какие-либо предложения?

Ответы [ 5 ]

6 голосов
/ 03 мая 2010

Это будет один для itertools.groupby, который группирует последовательные равные элементы из списка или других итераций.Вы можете указать функцию для сравнения, чтобы в вашем случае одно и то же имя в разных случаях можно было считать одним и тем же.

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
2 голосов
/ 03 мая 2010
names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
    print name, capitalized_name

Обратите внимание, что для правильной работы вам нужно четное количество предметов.

Или (возможно, лучше; трудно сказать с небольшим контекстом) используйте set для фильтрации списка, содержащего только уникальные имена (обратите внимание, что это теряет порядок):

>>> 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
0 голосов
/ 04 мая 2010

Мои $ 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)

Я не уверен, что точно понял вопрос; что ты пытаешься достичь?

0 голосов
/ 03 мая 2010

Когда вы выполняете цикл, вы можете попытаться отследить предыдущее имя в списке. В то же время, когда вы собираетесь хранить имена, вы можете вызвать метод lower () или capitalize (), чтобы согласовать форматирование каждого имени и упростить его сравнение.

, например

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

Возможно, не самый эффективный, но работает.

0 голосов
/ 03 мая 2010

Вы можете просто использовать цикл 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

Или вы ищете что-то более сложное?

...