Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2011 18:25:16

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

Надо пройтись по массиву чисел следующим образом: на первом проходе берем разницу первого и второго элемента. На втором проходе второго и третьего, далее 3 и 4 и так далее.

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

gist = [0] * 80

numbers = iter(numbers)
for element in numbers:
try:
next_element = numbers.next()
x = abs(element - next_element)
i = min(element, next_element) - 1
# работаем с x
except StopIteration:
pass
На втором проходе next() вызывается сначала в for element in numbers:, а потом в next_element = numbers.next(). То есть перескакиваем один элемент. Как обращаться к разным элементам numbers в цикле? Мне нужно что-то такое
numbers = [1, 2, 3, 4, 5, 6, 7, 8]

for element in numbers:
x = element + """ элемент, следующий за текущим""" + """ 4-ой элемент (i-тый элемент)""""



Офлайн

#2 Март 10, 2011 19:00:15

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

Циклы, получение нескольких итераторов

Если numbers идексируемый объект, то используй

for i, element in enumerate(numbers):
...
где i - у тебя будет номер итерации начиная с 0



Офлайн

#3 Март 10, 2011 19:29:46

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

Спасибо.



Офлайн

#4 Март 10, 2011 20:03:27

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

К получению нескольких итераторов по смыслу ближе zip

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
for n0,n1,n2 in zip(numbers[0::3],numbers[1::3],numbers[2::3]):
# делаем что надо



Офлайн

#5 Март 11, 2011 07:55:05

easlanov
От:
Зарегистрирован: 2010-08-11
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

numbers = [1,2,3,4,5,6,7,8]
for i,number in enumerate(numbers):
try:
next_number = numbers[i+1]
print abs(number - next_number)
except: pass



Офлайн

#6 Март 11, 2011 10:01:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

>>> def f(lst):
... return (lst[i] - lst[i + 1] for i in range(len(lst) - 1))
...
>>> print(*f(numbers))
-1 -1 -1 -1 -1 -1 -1
>>> g = f(numbers)
>>> next(g)
-1
>>> next(g)
-1
>>>
для второго питона
>>> def f(lst):
... return (lst[i] - lst[i + 1] for i in range(len(lst) - 1))
...
>>> for i in f(numbers):
... print i
...
-1
-1
-1
-1
-1
-1
-1
>>> i = iter(f(numbers))
>>> i.next()
-1
>>> i.next()
-1
>>>
а так возвращает итератор
>>> def f(lst):
... return iter(list(lst[i] - lst[i + 1] for i in range(len(lst) - 1)))
...
>>> i = f([1, 2, 3])
>>> type(i)
<type 'listiterator'>
>>>
это ещё одна для второго питона
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8]
>>> def f(lst):
... maxi = len(lst) - 2
... i = 0
... while i <= maxi:
... yield lst[i] - lst[i + 1]
... i += 1
...
>>> i = iter(list(f(numbers)))
>>> type(i)
<type 'listiterator'>
>>> i.next()
-1
>>> i.next()
-1
>>> i.next()
-1
>>>



Отредактировано (Март 11, 2011 10:27:10)

Офлайн

#7 Март 11, 2011 10:39:15

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

Ну если сдвижку делать тогда вообще просто все:

import numpy as np
numbers = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(numbers[:-1]-numbers[1:])



Отредактировано (Март 11, 2011 10:41:49)

Офлайн

#8 Март 11, 2011 20:06:18

easlanov
От:
Зарегистрирован: 2010-08-11
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклы, получение нескольких итераторов

В данному случае бессмыслено, просто для упражнения.

class Iterator:

def __init__(self, numbers):
self.numbers = numbers
self.iter_numbers = iter(numbers)
self.counter = 1

def __iter__(self):
return self

def next(self):
try:
result = abs(self.iter_numbers.next()-self.numbers[self.counter])
self.counter += 1
return result
except:
raise StopIteration

for i in Iterator([1,3,3,4,5,6,7,8,10]):
print i



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version