Вопрос

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

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

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

Я не могу придумать способ сделать это, используя Python's For Loop, какие -либо предложения?

Это было полезно?

Решение

Это было бы одно для 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

Другие советы

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

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

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

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

например

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top