Итак, я начну с объяснения контекста проблемы.
У меня есть массив, заполненный несколькими строками, и я хочу выбрать случайные элементы из этого массива, но после того, как элемент выбран один раз, его нельзя выбрать снова. Моим решением было просто удалить его из массива.
Я пытался:
dogs_array =['Bob', 'Fred', 'Jeff', 'Rick', 'Alice', 'Joe','Max', 'Will']
for x in range(3):
i = random.randint(0, 7)
print(dogs_array[i])
dogs_array.remove(i)
Однако я получаю сообщение об ошибке: ValueError: list.remove (x): x not in list
Что я должен делать?
del dogs_array[i]





Если вы хотите использовать для этого numpy, функция np.random.choice позволяет вам выбрать размер вашей выборки, а не перебирать range(3), как вы пытались, а аргумент replace=False гарантирует, что вы не выберете один и тот же дважды:
import numpy as np
dogs_array =['Bob', 'Fred', 'Jeff', 'Rick', 'Alice', 'Joe','Max', 'Will']
my_selection = np.random.choice(dogs_array, size=3, replace=False)
>>> my_selection
array(['Fred', 'Alice', 'Jeff'], dtype='<U5')
Метод remove в Python принимает элемент, а не только индекс.
Ваше решение будет работать, если вы используете dogs_array.remove(dogs_array[i])
Звучит как перебор, не так ли?
Хм, это просто напечатает "None" 3 раза. (?)
Как насчет использования метода pop, очень хорошего для того, что вы здесь делаете:
import random
dogs = ['Bob', 'Fred', 'Jess', 'Rick', 'Alice', 'Joe', 'Max', 'Will']
for x in range(3):
selection = random.randint(0, len(dogs)-1)
goner = dogs.pop(selection)
print(goner)
Выход
(xenial)vash@localhost:~/python$ python3.7 pop.py Max Bob Joe
При использовании pop вам нужно будет использовать len из-за того, что список будет изменять размеры, и вам понадобится случайный int для этого нового размера списка.
Для тех, кто ищет ответ на вопрос (np.array, а не list :)), это может помочь
import random
import numpy as np
dogs_array =np.array([[1,2,3],[4,5,6],[7,8,9]])
i = random.randint(0, len(dogs_array ))
my_set = dogs_array [i]
dogs_array = np.delete(dogs_array, np.arange(i,i+len(my_set),1)).reshape([-1,len(my_set)])
Это список, а не массив