如何打印同一个列表两次而不清空它?

2024-05-19 19:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在练习将itertool.accumulate函数与一些循环和if一起使用。作为结果,我想一个单一的数字(变量称为“调用”)和每个周期的总和,这是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]

[]


Tags: 代码inimport列表forifrangevariables
1条回答
网友
1楼 · 发布于 2024-05-19 19:29:14

最简单的解决方案:直接将其转换为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)
]

相关问题 更多 >