У меня есть список из 48 пунктов. Я хочу случайным образом выбрать 3 из этих элементов, а затем удалить эти три элемента из списка. После этого случайным образом выберите 3 новых предмета. Я хочу повторить это 16 раз, пока все ...

3
Henrik 16 Янв 2021 в 22:39

3 ответа

Лучший ответ

Вы можете использовать метод list.remove():

import numpy as np
import random

list = ['Pink', 'Red', 'Green', 'Darkgreen', 'Blue', 'Skyblue'] * 8

loop = np.arange(1,16)

for i in loop:
    item = random.sample(list, 3)
    print(item)
    for i in item:
        list.remove(i)

Обратите внимание, что считается плохой практикой называть переменные именами, уже присвоенными встроенному ind, например list. Лучше назвать ваш список другим именем, например colors:

import random

colors = ['Pink', 'Red', 'Green', 'Darkgreen', 'Blue', 'Skyblue'] * 8

for i in range(0, len(colors), 3):
    item = random.sample(colors, 3)
    print(item)
    for i in item:
        colors.remove(i)

ОБНОВИТЬ

Как было замечено b @dawg, метод list.remove() всегда удаляет элементы из списка, ближайшего к началу списка, убирая понятие случайности.

Я понял, что было бы точнее использовать индексы вместо значений, поэтому используйте list.pop() вместо list.remove():

from random import randint

colors = ['Pink', 'Red', 'Green', 'Darkgreen', 'Blue', 'Skyblue'] * 8

while colors:
    lst = [colors.pop(randint(0, len(colors) - 1)) for _ in range(3)]
    print(lst)
0
Ann Zen 16 Янв 2021 в 21:00

np.arange(1,16) имеет длину 15, но вы хотите выполнить цикл 16 раз. Кроме того, избегайте использования list.remove, когда в списке есть дубликаты, даже если это, вероятно, не вызовет проблем с вашей конкретной проблемой. Наконец, как было сказано, избегайте использования «списка» в качестве имени, поскольку оно уже используется Python. Вот мое предложение, работая над индексами и используя метод list.pop (0):

l = ['Pink', 'Red', 'Green', 'Darkgreen', 'Blue', 'Skyblue'] * 8

for i in range(16):
    item = random.sample(range(len(l)), 3)
    for k in sorted(item, reverse=True):
        l.pop(k)

print(l)
#[]
1
IoaTzimas 16 Янв 2021 в 20:05

Вы также можете использовать метод list.pop (index).

import random as rd
import numpy as np
lst = ['Pink', 'Red', 'Green', 'Darkgreen', 'Blue', 'Skyblue'] * 8
loop = np.arange(1,16)
for i in loop:
    for k in range(0,3):
        item = lst.pop(rd.choice(range(0,len(lst))))
        print(item)

.pop (index) делает две вещи. Он возвращает элемент по заданному индексу списка. Затем он удаляет этот элемент из списка.

Внутри функции .pop () мы имеем следующее: случайный выбор числа (который является индексом) выбор представляет собой список чисел от 0 до длины списка (исключая).

0
A.Karwowski 16 Янв 2021 в 20:01
65753893