如何在不清空的情况下两次打印相同的列表?

时间:2017-05-20 12:47:17

标签: python list itertools

我正在练习使用itertool.accumulate函数和一些循环和ifs。作为结果,我想要一个单个数字的列表(变量称为"调用")和每个周期的总和,它们是3。

现在,我已经设法获得两个列表,但不是同时。我的意思是,看起来一旦列表被打印,它就会变空。我错过了什么吗?我怎样才能打印这两个列表?

我将发布两个带输出的代码,以显示我的意思。

第一个代码:它只打印单个值

import random as rnd
import itertools

# variables
a = 5
b = int(1)
########
calls = (
    tuple((itertools.accumulate(
        a if a > rnd.randint(1, 10) else -a
        for i in range(b)
        for j in range(2))
    )
    )
    for cycle in range(3)
)
#######
print(list(calls))
print(list(sum(call) for call in calls))
  

[(5,0),( - 5,-10),(5,0)]

     

[]

第二个代码:它只打印值的总和     随机导入为rnd     import itertools

# variables
a = 5
b = int(1)
########
calls = (
    tuple((itertools.accumulate(
        a if a > rnd.randint(1, 10) else -a
        for i in range(b)
        for j in range(2))
    )
    )
    for cycle in range(3)
)
#######
print(list(sum(call) for call in calls)
print(list(calls))
  

[5,-15,5]

     

[]

1 个答案:

答案 0 :(得分:2)

最简单的解决方案:直接将其转换为list

calls = list(    # only changed here
    tuple((itertools.accumulate(
        a if a > rnd.randint(1, 10) else -a
        for i in range(b)
        for j in range(2))
    )
    )
    for cycle in range(3)
)

问题是您在使用时创建generator expression (PEP 289)

(... for cycle in range(3))

和生成器表达式不能重复使用,它们用于懒惰一次性评估。

您也可以使用列表推导[ ... ]代替( ... )

calls = [
    tuple((itertools.accumulate(
        a if a > rnd.randint(1, 10) else -a
        for i in range(b)
        for j in range(2))
    )
    )
    for cycle in range(3)
]