2017-05-20 73 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) 
] 
相關問題