#python #list #random
#python #Список #Случайный
Вопрос:
Если бы я хотел выбрать случайным образом из такого списка, и я получил b…
list=[a,b,c,d]
Есть ли простой способ выбрать другой элемент из списка, не выбирая b снова, не изменяя список в любом случае?
Комментарии:
1. Есть несколько способов, которые кажутся прямыми. Вы пробовали какой-либо из них? Например: (1) Цикл, пока случайно выбранный элемент не станет b; (2) Создайте копию списка без b, из которого вы выбираете
2. Ну, я пытаюсь узнать об эффективности. Мне просто интересно, есть ли однострочный синтаксический способ сделать это, но если нет, я просто соглашусь на циклы.
3. Вы хотите выбрать 2 или более отдельных элемента из своего списка?
random.sample
Для этого есть функция. В любом случае, ваш вопрос неясен…4. И если требуется только один элемент, он также есть
random.choice
(но он не решает проблему «без повторного выбора b»)5. Лучшей идеей может быть использование копии этого списка и
shuffle
его. Затемpop
один элемент за другим.
Ответ №1:
Может быть, вы могли бы использовать random.sample
:
Возвращает список уникальных элементов длиной k, выбранных из последовательности или набора совокупности. Используется для случайной выборки без замены.
>>> import random
>>> l = ['a', 'b', 'c', 'd']
>>> random.sample(l, 3) # Pick 3 random elements without replacement from l
['c', 'd', 'a']
Комментарии:
1. Вероятно, лучше сказать
random.sample(l, len(l)-1)
для более общего случая. Хотя не знал обrandom.sample()
этом — очень крутой трюк.
Ответ №2:
Хотя ответ Шаша Синха, безусловно, то, что вы ищете, вы также можете немного поиграть с рекурсией (это изменяет исходный список, поэтому он не идеален):
import random
choices = ['a', 'b', 'c', 'd']
def chooseRandom():
if len(choices) > 0:
choice = choices.pop(random.randint(0, len(choices)-1))
print (f'Chosen Character: {choice}')
print (f'Remaining Choices: {choices}')
chooseRandom()
chooseRandom()
Который будет выводить что-то похожее на следующее (в зависимости от того, что выбрано случайным образом):
Chosen Character: c
Remaining Choices: ['a', 'b', 'd']
Chosen Character: a
Remaining Choices: ['b', 'd']
Chosen Character: b
Remaining Choices: ['d']
Chosen Character: d
Remaining Choices: []
Ответ №3:
import copy
import random
list = ['a', 'b' , 'c', 'd']
list2 = copy.deepcopy(list)
random.shuffle(list2)
for i in list2:
# i is now a random item from original list
do_something(i)
Вы также можете просто отключить функцию pop() от list2, когда вам нужен случайный элемент