【问题标题】:Python 3.5 loop to generate a new list each iterationPython 3.5 循环每次迭代生成一个新列表
【发布时间】:2020-04-05 00:31:37
【问题描述】:

我正在尝试编写一些代码(伪随机)生成 7 个数字的列表。我让它运行一次。我希望能够循环此代码以生成多个列表,我可以将其输出到 txt 文件(我不需要帮助,我很喜欢使用 i/o 和文件 :)

我现在正在使用这段代码(感谢 Jason 到目前为止):

import random

pool = []
original_pool = list( range( 1,60))

def selectAndPrune(x):
        pool = []
        list1 = []
        random.shuffle(pool)
        pool = original_pool.copy()
        current_choice = random.choice(pool)
        list1.append(current_choice)
        pool.remove(current_choice)
        random.shuffle(pool)
        print(list1)

def repeater():
    for i in range(19):
        pool_list = []
        pool = original_pool.copy()
        a = [ selectAndPrune(pool) for x in range(7)]
        pool_list.append(a)

repeater()

这给出了单值列表的输出,例如:

[21]
[1]
[54]
[48]
[4]
[32]
[15]
etc.

我想要的输出是 19 个列表,全部包含 7 个随机整数:

[1,4,17,23,45,51,3] 
[10,2,9,38,4,1,24]
[15,42,35,54,43,28,14]
etc

【问题讨论】:

  • 您正在尝试创建 19 个子列表,每个子列表的长度为 7(总共 133 个元素)。但是每次迭代你都会从池中删除一个元素(在开始时 59 个元素),所以这就是你得到错误的原因。
  • 是的。如果您将范围更改为 (2),则代码会附加相同的列表,而不是生成包含 7 个数字的新列表。我想在每次通过时创建一个新列表,并重置池(现在你已经提到了!)

标签: list loops random python-3.5


【解决方案1】:

如果我正确理解了这个问题,那么目标是重复一个函数 19 次。但是,此函数会在每次调用时缓慢地从列表中删除项目,因此无法超过 问题中当前所写的池大小。我怀疑解决方案是这样的:

import random

def spinAndPrune():
    random.shuffle( pool )
    current_choice = random.choice( pool )
    pool.remove( current_choice )
    random.shuffle( pool )
    return current_choice

首先,我在函数调用的末尾添加了一个返回命令。接下来,您可以复制原始池,以便可以根据需要多次重新运行它。此外,您需要存储要保留的列表:

# create an original pool of values
original_pool = list( range( 1, 60 ) )

# initialize a variable that stores previous runs
pool_list = []

# repeat 19 times
for i in range( 19 ):

    # create a copy of the original pool to a temporary pool
    pool = original_pool.copy()

    # run seven times, storing the current choice in variable a
    a = [ spinAndPrune() for x in range( 7 ) ]

    # keep track of variable a in the pool_list
    pool_list.append( a )
    print( a )

注意.copy() 函数来制作列表的副本。顺便说一句,range() 可以轻松创建包含整数 1-59 的列表。

如果你需要提取一个特定的列表,你可以这样做:

# print first list
print( pool_list[ 0 ] )

# print fifth list
print( pool_list[ 4 ] )

# print all the lists
print( pool_list )

【讨论】:

  • 感谢 Jason,您正在理解它。我希望我能想到列表声明中的范围!我明白你的想法,但是这仍然给出了同样的错误。它也不会输出 7 个的多个列表,它会继续附加输出列表,因此它是 > 7
  • 好吧,我误解了输出。显然,您想跟踪七个随机数,而不是剩余的 59-7 列表。查看我的答案的修改
  • List1 是输出列表,是的,我想要输出 19 组独立的 7 个数字:[1,2,5,36,47,53,35] [55,3,15,36 ,7,5,3] 等等 你的​​代码读起来很有趣,但是我在分配之前引用了本地 var 'pool',所以不确定它是否有效!
  • 啊,所以我修改了代码以便它工作(在函数内部移动列表声明 - 输出给我一个垂直的单整数行,如:[34]。所以它看起来像最终输出列表仅包含 1 个值,我想要 y 值。
【解决方案2】:

在我的另一个答案中,我通过修改原始问题中的代码来解决它。但是,如果只是要在集合/列表中提取 X 个值而不重复,那么使用 random.sample() 函数可能是最简单的。代码可以是这样的:

import random

pool = list( range( 1, 60 ) )
pool_list = []

# sample 19 times and store to the pool_list
for i in range( 19 ):
    sample = random.sample( pool, 7 )
    pool_list.append( sample )
    print( sample )

【讨论】:

  • 我已经对 OP 进行了编辑,希望能让我想要的输出更清晰。我可以看到你在用它做什么,它并没有给我我需要的输出,但我认为你快到了!这看起来比我的原始代码更好:)
  • 我再次修改了这个答案。如果您的唯一目标是打印与您在问题中要求的值相匹配的值,那么它会更简单,因为您可以删除两个 pool_list 行。
  • 感谢您的努力,我已编辑问题并将代码替换为我正在使用的代码。我认为它只是让它更清楚 - 抱歉我第一次没有很好地解释。
  • 我刚刚修改了两个答案以打印您想要的内容。祝你好运
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2017-04-28
  • 2012-09-21
相关资源
最近更新 更多