我正在练习使用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]
[]
答案 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)
]