使用生成器中上一步的信息?

时间:2014-02-21 20:50:01

标签: python list python-2.7 methods generator

我有一个试图模仿实时的发电机。此生成器确保用户无法访问未来,但只能访问当前时间。

为了简化我的情况,我使用这个发生器

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()

案例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])

我不知道如何通过使用:

来实现这一目标
for x in generator(5):
    do sum operation

我将在for循环中使用的值将在下一次迭代中消失。

请不要关注数字和结果,而应主要关注可能解决方案背后的逻辑和算法。在这种情况下,对我来说重要的是能够保留不允许访问未来数据的情况,只有过去的数据可以用于计算,但是我认为过去的数据已经消失了。迭代结束了!

任何解决方案?建议?

提前致谢!

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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