【问题标题】:How to select a random object except one spesific one from a list?如何从列表中选择一个随机对象,除了一个特定的对象?
【发布时间】:2019-02-04 14:57:06
【问题描述】:

我正在使用 Expyriment 包设计一个实验。有两个盒子,我给它们随机颜色,但它们必须彼此不同。我使用for循环和枚举来循环遍历:

color = [(0, 76, 153), (204, 0, 0), (0, 153, 0), (255, 230, 0)]

for i, x in enumerate(color):
    print(color[i])
    print(random.choice(color.remove(color[i])))

从这里出现了 2 个问题,我删除的元组永远消失了,我得到了一个 TypeError: object of type 'NoneType' has no len()

我正在寻找一种方法来临时删除一个元组以进行循环但找不到它。

另外,当我尝试使用 pop print(random.choice(color.pop(i))) 时, 它没有给我一个错误,但它只是打印 int 而不是元组。另外,我弹出的对象仍然永远消失了。

完整代码>

color = [(0, 76, 153), (204, 0, 0), (0, 153, 0), (255, 230, 0)]
letter = ('b', 'r', 'g', 'y')

for i, x in enumerate(color):
frame = stimuli.Canvas((600, 600))
sti = stimuli.TextLine(letter[i], text_bold=True, text_colour=misc.constants.C_WHITE,
                       text_size=100, text_font='calibri')

positions = (200, -200)
n = (0, 1)
ac = random.choice(n)  # randomize the place of true box

sti_squ_1 = stimuli.Rectangle((100, 100), colour=color[i], position=(positions[ac], -200))  # true box
sti_squ_2 = stimuli.Rectangle((100, 100), colour=color[random.choice(color.remove(color[i]))], position=(positions[1 - ac], -200))

【问题讨论】:

  • 你在哪里使用x
  • "...'NoneType' 没有 len()"。我没有看到您在代码中使用 len
  • 为什么不在进入for循环之前删除你不想选择的特定的?
  • 我也需要遍历其他列表,所以我使用 i 和 x。我应该发布整件事吗?
  • 是的,您应该发布足够的代码,以便我们可以在满足您所有要求的情况下重现您的问题。

标签: python list for-loop random tuples


【解决方案1】:

如果您想从集合中随机选择多个项目而不多次选择同一事物,则称为无放回随机抽样。 Python 的 random 模块有一个专门用于此的函数,称为 random.sample

import random

color = [(0, 76, 153), (204, 0, 0), (0, 153, 0), (255, 230, 0)]

places = [(200, -200), (-200, -200)]

stim_squares = []
for place, col in zip(random.sample(places, len(places)),
                      random.sample(color, len(places))):
    stim_squares.append(
        stimuli.Rectangle((100, 100), colour=col, 
                          position=place))  

【讨论】:

  • 甚至不能感谢你对我的“声誉”的支持,但谢谢你。顺便说一句,它正在工作,但有一个错误,如果试验是红色 + 黄色,它总是红色 + 黄色,它没有正确洗牌。
  • 只有当你重复相同的seed时才会发生这种情况@
【解决方案2】:

您可以在 for 循环内创建一个新列表,排除该迭代的当前项目:

import random

color = [(0, 76, 153), (204, 0, 0), (0, 153, 0), (255, 230, 0)]

for i in color:
    test = [j for j in color if j!=i]
    print(random.choice(test))

请注意,使用 color.remove(color[i]))(或 color.remove(x),在您的 OP 中等效)将返回 None。另请注意,remove 不返回任何内容。它就地修改现有列表。这就是您收到 NoneType 错误的原因。

上面的代码输出(例如):

(0, 153, 0)
(255, 230, 0)
(255, 230, 0)
(204, 0, 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 2021-03-17
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多