0
votes

Existe-t-il un moyen simple de choisir au hasard dans une liste à l'exception d'un élément?

Si je voulais choisir au hasard dans une liste comme celle-ci, et j'ai eu b ...

list=[a,b,c,d]

Existe-t-il un moyen simple de choisir un autre élément de la liste, sans sélectionner à nouveau b, sans modifier la liste de toute façon?


6 commentaires

Il existe plusieurs façons qui semblent toutes simples. Avez-vous essayé l'un d'entre eux? Par exemple: (1) Boucle jusqu'à ce que l'élément choisi au hasard ne soit pas b; (2) Créez une copie de la liste sans b dans laquelle vous choisissez


Eh bien, j'essaie d'en apprendre davantage sur l'efficacité. Je me demandais simplement s'il y avait une manière syntaxique d'une ligne pour le faire, mais si ce n'est pas le cas, je me contenterai de boucles.


Souhaitez-vous choisir 2 articles distincts ou plus dans votre liste? Il existe une fonction random.sample pour cela. Quoi qu'il en soit, votre question n'est pas claire ...


Et si un seul élément est nécessaire, il y a aussi random.choice (mais cela ne résout pas la partie `` sans reprendre b à nouveau '' du problème)


La meilleure idée pourrait être d'utiliser une copie de cette liste et de la shuffle . Puis pop un élément après l'autre.


si la liste est longue; l'échantillonnage de rejet est souvent le plus efficace


3 Réponses :


4
votes

Peut-être que vous pourriez utiliser random. sample :

Renvoie une liste de longueurs k d'éléments uniques choisis dans la séquence ou l'ensemble de population. Utilisé pour un échantillonnage aléatoire sans remplacement .

>>> import random
>>> l = ['a', 'b', 'c', 'd']
>>> random.sample(l, 3) # Pick 3 random elements without replacement from l
['c', 'd', 'a']


1 commentaires

Probablement mieux de dire random.sample(l, len(l)-1) pour un cas plus général. Je ne savais pas pour random.sample() cependant - truc très cool.



1
votes

Bien que la réponse de Shash Sinha soit certainement ce que vous recherchez, vous pouvez également jouer un peu avec la récursivité (cela modifie la liste d'origine, donc ce n'est pas idéal):

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: []

Ce qui donnerait quelque chose de similaire à ce qui suit (en fonction de ce qui est choisi au hasard):

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()


0 commentaires

0
votes
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)
You can also just pop() off list2 when you need a random item

0 commentaires