Итератор питона
-
02-10-2019 - |
Вопрос
У меня есть этот список:
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)
Я не уверен, что понял именно вопрос; Что вы пытаетесь достичь?