如何从列表中选择一个随机对象以外的随机对象?

时间:2018-08-29 18:20:09

标签: python list for-loop random tuples

我正在设计带有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:'NoneType'类型的对象没有len()

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

此外,当我尝试使用弹出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))

2 个答案:

答案 0 :(得分:0)

您可以在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]))(或OP中等效的color.remove(x))将返回None。另请注意,remove不返回任何内容。它就地修改现有列表。这就是您收到NoneType错误的原因。

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

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

答案 1 :(得分:0)

如果您要从一个集合中随机选择多个项目而不选择多次选择同一事物,则称为不替换的随机抽样。 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))