Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2009 01:40:11

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Итераторы, как обратиться к предыдущему и следующему?

Когда я перебираю какой-то итерируемый объект, как можно на определенной итерации обратиться к предыдущему, следующему или какому-либо еще элементу?

Я придумал вот такое решение, но оно мне не очень нравится. Например, сумма текущего и предыдущего элементов:

lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for n in lst:
print n + lst[lst.index(n) - 1]
Еще и предыдущий первого и следующий от последнего элемента не совсем интуитивно понятные, лучше бы их вообще не было. Может я зря извращаюсь, и есть какие-то нормальные способы?



Офлайн

#2 Авг. 21, 2009 01:57:02

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Итераторы, как обратиться к предыдущему и следующему?

Можно сделать с помощью reduce или лямбда-выражения.

Офлайн

#3 Авг. 21, 2009 05:22:22

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Итераторы, как обратиться к предыдущему и следующему?

Ничего не понимаю…

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]



Офлайн

#4 Авг. 21, 2009 06:10:29

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Итераторы, как обратиться к предыдущему и следующему?

Вот такой еще вариант, не особо лаконичен, зато все явно:

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Авг. 21, 2009 12:07:47

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Итераторы, как обратиться к предыдущему и следующему?

Вместо 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



Отредактировано (Авг. 21, 2009 15:05:55)

Офлайн

#6 Авг. 21, 2009 13:58:37

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Итераторы, как обратиться к предыдущему и следующему?

А вариант с индексами проканает в случае, если я буду изменять последовательность внутри цикла?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version