【问题标题】:Using python random.choice in combination with list.append()将 python random.choice 与 list.append() 结合使用
【发布时间】:2018-03-14 20:01:34
【问题描述】:

最近,我在使用 Python 的 random.choice 函数时遇到了一些问题。 我希望我添加的示例脚本打印出一个包含 3 个项目的列表。这些项目中的每一项都应该是一个包含两个整数和一个字符串的列表。

例如:[[1, 4, 'a'], [2, 1, 'b'], [3, 4, 'c']]

from random import choice

pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[4, 1], [4, 2], [4, 3]
]

list = [0, 0, 0]

list[0] = choice(pair)
list[0].append('a')
list[1] = choice(pair)
list[1].append('b')
list[2] = choice(pair)
list[2].append('c')

print(list)

脚本在大多数情况下都按预期工作。然而,有时它会打印出如下内容:

[[3, 2, 'a', 'c'], [4, 3, 'b'], [3, 2, 'a', 'c']]

列表中的两个项目不仅由一个字符串组成太多,而且由于某种原因它们是相同的。 首先,我认为这与append 函数有关。 但是,当我像这样删除 random.choice 组件时:

list = [0, 0, 0]
list[0] = [1, 2]
list[0].append('a')
list[1] = [2, 3]
list[1].append('b')
list[2] = [3, 4]
list[2].append('c')

print(list)

它仍然可以正常工作,没有任何缺陷。 random.choice 函数也一样,它本身不会导致任何问题:

from random import choice

pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[3, 1], [3, 2], [4, 3],

list = [0, 0, 0]

list[0] = choice(pair)
list[1] = choice(pair)
list[3] = choice(pair)

print(list)

接下来我测试了当列表只包含一项并且list.appendrandom.choice 只执行一次时会发生什么

from random import choice

pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[4, 1], [4, 2], [4, 3]
]

list = [0]

list[0] = choice(pair)
list.append('a')

print(list)

这个脚本的行为也符合我的预期。显然我的问题只发生在random.choicelist.append 在列表中的不同项目上执行多次时,但我不知道如何解释。有人可以解释发生了什么以及如何解决吗?

【问题讨论】:

  • 您正在将配对本身放入您的列表中。然后,当您附加到它们时,您将永久修改它们;如果稍后随机选择同一对,则它已经附加了一个字母。一种解决方案是在修改它们之前将它们的副本放在列表中:例如list[0] = choice(pair)[:]
  • 对于第一个示例,我无法重现该问题(我松了一口气)。我得到[[3, 2, 'a'], [2, 3, 'b'], [2, 1, 'c']]choice 每次返回一个不同的列表。你能创建一个更短的minimal reproducible example 预期输出和实际输出吗?

标签: python random append


【解决方案1】:

首先,我打开 REPL 提示符并运行您的第一个代码块

>>> from random import choice
>>> 
>>> pair = [
... [1, 2], [1, 3], [1, 4],
... [2, 1], [2, 3], [2, 4],
... [3, 1], [3, 2], [3, 4],
... [4, 1], [4, 2], [4, 3]
... ]
>>> 
>>> list = [0, 0, 0]
>>> 
>>> list[0] = choice(pair)
>>> list[0].append('a')
>>> list[1] = choice(pair)
>>> list[1].append('b')
>>> list[2] = choice(pair)
>>> list[2].append('c')
>>> 
>>> print(list)
[[4, 1, 'a'], [3, 4, 'b'], [1, 2, 'c']]

看起来不错,但是如果您检查 pair 会发生什么

>>> pair
[[1, 2, 'c'], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4, 'b'], [4, 1, 'a'], [4, 2], [4, 3]]

因此,通过附加到choice(pair) 返回的列表,您无意中修改了pair

这是因为choice(pair) 没有复制子列表。

如果您要复制子列表,请使用

list[0] = choice(pair)[:]

list[0] = choice(pair).copy()

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2016-09-05
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多