Есть ли простой способ случайного выбора из списка, за исключением одного элемента?

#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, когда вам нужен случайный элемент