2014-02-21 4 views
1

У меня есть генератор, который пытается имитировать в реальном времени. Этот генератор гарантирует, что пользователь не имеет доступа к будущему, но только к текущему времени.Использование информации с предыдущего шага в генераторах?

Чтобы упростить мой случай я использовать этот генератор

def generator(n): 
    for x in range(n): 
     yield [[x],[x+3]] 

при запуске для n = 5 генератор возвращает:

[[0], [3]] 
[[1], [4]] 
[[2], [5]] 
[[3], [6]] 
[[4], [7]] 

Я хочу, чтобы иметь возможность комбинировать элементы каждого генератора итерации с элементами предыдущей итерации генератора для вычисления sum() внутренних списков

case 1:

sum([0]), sum([3]) 

случай 2:

sum([0,1]), sum([3,4]) 

случай 3:

sum([0,1,2]), sum([3,4,5]) 

...

случай ПОСЛЕДНИЙ

sum([0,1,2,3,4]), sum([3,4,5,6,7]) 

Я не вижу, как это может быть chieved с помощью:

for x in generator(5): 
    do sum operation 

ценности, которые я буду использовать в цикле for пропадут для следующей итерации.

Пожалуйста, не сосредотачивайтесь на цифрах и результатах, но главным образом на логике и алгоритме, лежащем в основе возможного решения. В этом случае для меня важно иметь возможность сохранить ситуацию, когда доступ к будущим данным не разрешен, для расчетов могут использоваться только данные из прошлого, однако данные, которые я считаю из прошлого, уже исчезли, когда для итерация завершена!

Любое решение? Предложения?

Заранее благодарен!

+0

вы можете хранить предварительно обработанные данные? – dm03514

+0

@ dm03514 да разрешено хранить предыдущие итерации генератора. –

ответ

3
l1, l2 = [], [] 
for x1, x2 in generator(5): 
    l1.extend(x1) 
    l2.extend(x2) 
    print sum(l1), sum(l2) 

Кажется довольно простым. Это не похоже на то, что генератор может заставить вас забыть, что это дало вам. Если операция, которую вы хотите сделать, такая простая, как sum, вам даже не нужно хранить все старые данные, просто их сумму.

sum1 = sum2 = 0 
for x1, x2 in generator(5) 
    sum1 += x1[0] 
    sum2 += x2[0] 

Если количество списков вам нужно это динамический, который легко обрабатывать:

lists = [[] for _ in xrange(numberoflists)] 
for subtuple in generator(5): 
    for element, sublist in zip(subtuple, lists): 
     sublist.extend(element) 
    do_whatever_with(map(sum, lists)) 
+0

Похоже, мы оба взяли почти такой же подход. Распаковка значений из генератора имеет большой смысл. Намного легче читать. –

+0

первый отрезанный код служит мне лучше. Как я могу обработать ситуацию, когда количество списков в начале: 'l1',' l2' должно быть определено динамически, а также число операций 'l1.extend (x1)' должно быть динамическим ... –

+1

@WolfgangKuehne: см. Расширенный ответ. – user2357112

0

Я надеюсь, что это правильно понял, но вы пытаетесь сделать что-то вроде этого?

>>> tmp = [[],[]] 
>>> for x in generator(5): 
     tmp[0] += x[0] 
     tmp[1] += x[1] 
     print sum(tmp[0]),sum(tmp[1]) 


0, 3 
1, 7 
3, 12 
6, 18 
10, 25 
>>> tmp 
[[0, 1, 2, 3, 4], [3, 4, 5, 6, 7]] 

Или, если вы не хотите, чтобы сохранить весь список:

>>> tmp = [0,0] 
>>> for x in generator(5): 
     tmp[0] += x[0][0] 
     tmp[1] += x[1][0] 
     print tmp[0],tmp[1] 


0, 3 
1, 7 
3, 12 
6, 18 
10, 25 
Смежные вопросы