2017-05-20 37 views
0

我正在练习使用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 进口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]

[]

回答

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) 
] 
相关问题