Как выбирать рандомно элемент из списка, без повторений?

Пример: list = ["one", "two", "three"]

Мы берем из этих 3 элементов рандомно элементы без повторения, когда элементы кончаются, то начинаем заново, опять обращаемся к списку list и опять берем рандомно элементы и так по кругу.


Ответы (2 шт):

Автор решения: MBo
import random
lst = ['a', 'b', 'c']
for _ in range(10):
    random.shuffle(lst)
    for x in lst:
        print(x, end = ' ')
    print()
>>>
a c b 
b a c 
b c a 
b c a 
c b a 
c b a 
b a c 
c a b 
a b c 
c b a 
→ Ссылка
Автор решения: CrazyElf

Примерно тоже самое, что уже описали в комментариях и в ответе, просто с отдельной функцией-генератором, из которой можно брать значения:

from random import shuffle

def gen(lst):
    while True:
        shuffle(lst)
        yield from lst

lst = ["one", "two", "three"]
for i, item in enumerate(gen(lst)):
    # ограничим тремя проходами по списку для примера
    if i >= len(lst)*3:
        break
    print(item)

Пример вывода:

one
three
two
three
one
two
two
three
one

В такой парадигме можно брать произвольное число элементов из генератора, не обязательно кратное длине списка.

P.S. Ещё один способ перебрать нужное число элементов, пусть это будет 5:

lst = ["one", "two", "three"]
g = gen(lst)
for _ in range(5):
    item = next(g)
    print(item)

Или так:

lst = ["one", "two", "three"]
for item, _ in zip(gen(lst), range(5)):
    print(item)
→ Ссылка