Как удалить случайный элемент из массива. Python

Итак, я начну с объяснения контекста проблемы.

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

Я пытался:

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

Что я должен делать?

Это список, а не массив

Mad Physicist 13.09.2018 23:50
del dogs_array[i]
Stop harming Monica 13.09.2018 23:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
4 335
4

Ответы 4

Если вы хотите использовать для этого 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])

Звучит как перебор, не так ли?

Mad Physicist 13.09.2018 23:52

Хм, это просто напечатает "None" 3 раза. (?)

Ether 14.09.2018 00:17

Как насчет использования метода 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)])

Другие вопросы по теме