我正在设计带有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))
答案 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))