【问题标题】:How can I print the same list twice without empty it?如何在不清空相同列表的情况下打印两次?
【发布时间】:2017-05-20 20:55:21
【问题描述】:

我正在练习使用带有一些循环和 if 的 itertool.accumulate 函数。结果,我想要一个单数列表(变量称为“调用”)和每个周期的总和,即 3。

现在,我设法获得了两个列表,但不是同时获得。我的意思是,一旦打印了一个列表,它就会变成空的。我错过了什么吗?如何打印两个列表?

我将发布两个带有输出的代码,以向您展示我的意思。

FIRST CODE:它只打印单个值

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 导入迭代工具

# 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]

[]

【问题讨论】:

    标签: python list itertools


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多