Как выбрать случайный объект кроме одного специального из списка? - PullRequest
0 голосов
/ 29 августа 2018

Я планирую эксперимент с пакетом Expyriment. Есть две коробки, и я даю им случайные цвета, но они должны отличаться друг от друга. Я использую для цикла и перечислить для цикла:

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 ()

Я ищу способ временно удалить кортеж для зацикливания, но не могу его найти.

Кроме того, когда я пытался использовать 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))

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вы хотите случайным образом выбрать количество элементов из коллекции, не выбирая одно и то же несколько раз, это называется случайной выборкой без замены. Случайный модуль Python имеет специальную функцию, которая называется 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))  
0 голосов
/ 29 августа 2018

Вы можете создать новый список внутри цикла 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)
...