цикл для Python, как найти следующее значение (объект)? - PullRequest
3 голосов
/ 14 октября 2010

Привет, я пытаюсь использовать для цикла, чтобы найти разницу между каждыми двумя объектами минус друг друга Итак, как я могу найти следующее значение в цикле for?

for entry in entries:
    first = entry      # Present value
    last = ??????      # The last value how to say?
    diff = last = first

Ответы [ 4 ]

12 голосов
/ 14 октября 2010

Следует отметить, что нет из этих решений работают для генераторов.Для этого см. Превосходное решение Гленна Мейнарда.

используйте zip для небольших списков:

 for current, last in zip(entries[1:], entries):
     diff = current - last

Это создает копию списка (и список кортежей из обеих копий списка), поэтомухорошо использовать itertools для обработки больших списков

import itertools as it

items = it.izip(it.islice(entries, 1, None), entries)
for current, last in items:
    diff = current - last

Это позволит избежать создания копии списка и создания списка кортежей.

Другой способсделать это без создания копии

entry_iter = iter(entries)
entry_iter.next() # Throw away the first version
for i, entry in enumerate(entry_iter):
    diff = entry - entries[i]

И еще один способ:

for i in xrange(len(entries) - 1):
    diff = entries[i+1] - entries[i]

Это создает итератор, который индексирует entries и увеличивает его на единицу.Затем он использует enumerate, чтобы получить индекс с предметом.Индекс начинается с 0 и, таким образом, указывает на предыдущий элемент, потому что мы включаем один элемент цикла.

Кроме того, как указал Тайлер в комментарии, цикл может быть излишним для такой простой проблемы, если вы просто хотитеперебрать различия.

diffs = (current - last for current, last in 
         it.izip(it.islice(entries, 1, None), entries))
6 голосов
/ 14 октября 2010

zip работает для списков, но для общего случая:

def pairs(it):
    it = iter(it)
    prev = next(it)
    for v in it:
        yield prev, v
        prev = v

a = [1,2,3,4,5]
for prev, cur in pairs(a):
    print cur - prev

import itertools as it
for prev, cur in pairs(it.cycle([1,2,3,4])):
    print cur - prev

Это эффективно работает для больших контейнеров, и что более важно, оно работает для итераторов:

for prev, cur in pairs(open("/usr/share/dict/words").xreadlines()):
    print cur, prev,

Edit: я изменил генератор, чтобы пропустить первое значение без предыдущего значения, так как это лучше соответствует исходному вопросу («поиск различий между соседними парами»), и я добавил пример, показывающий, что он работает для бесконечно повторяющийся итератор.

1 голос
/ 14 октября 2010

Я не знаю точно, что вы ищете, но, возможно, это может помочь:

first = entries[0]
for entry in entries[1:]:
    last = entry       
    diff = last - first 
    first = entry
1 голос
/ 14 октября 2010

очень просто, с использованием перечисления, ничего необычного

>>> entries=[10,20,30,40]
>>> for n,i in enumerate(entries):
...     try:
...        print entries[n+1] - i
...     except IndexError:
...        print entries[-1]
...
10
10
10
40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...