Найти - Пользователи
Полная версия: Итераторы, как обратиться к предыдущему и следующему?
Начало » Python для новичков » Итераторы, как обратиться к предыдущему и следующему?
1
pasaranax
Когда я перебираю какой-то итерируемый объект, как можно на определенной итерации обратиться к предыдущему, следующему или какому-либо еще элементу?

Я придумал вот такое решение, но оно мне не очень нравится. Например, сумма текущего и предыдущего элементов:
lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for n in lst:
print n + lst[lst.index(n) - 1]
Еще и предыдущий первого и следующий от последнего элемента не совсем интуитивно понятные, лучше бы их вообще не было. Может я зря извращаюсь, и есть какие-то нормальные способы?
Ferroman
Можно сделать с помощью reduce или лямбда-выражения.
ZZZ
Ничего не понимаю…
l = [...]
for i in range(len(l)):
pre = l[i-1] if i > 0 else None
curr = l[i]
next = l[i+1] if i < len(l) - 1 else None
Или так…
l = [...]
assert len(l) >= 3
for i in range(1, len(l)-1):
pre = l[i-1]
curr = l[i]
next = l[i+1]
PooH
Вот такой еще вариант, не особо лаконичен, зато все явно:
import itertools
ls = [1, 2, 3, 4, 5, 6]
for prev, curr, next in map(None, itertools.chain((None,), ls[:-1]), ls, ls[1:]):
print prev, curr, next

None 1 2
1 2 3
2 3 4
3 4 5
4 5 6
5 6 None
bw
Вместо map можно использовать izip:
for prev, curr, next in itertools.izip(itertools.chain([None], ls[:-1]), ls, itertools.chain(ls[1:], [None])):
print prev, curr, next
Не знал, что map может работать с несколькими последовательностями, век живи – век учись :-).

..bw
pasaranax
А вариант с индексами проканает в случае, если я буду изменять последовательность внутри цикла?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB