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?
3 Réponses :
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']
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.
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()
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
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
. Puispop
un élément après l'autre.si la liste est longue; l'échantillonnage de rejet est souvent le plus efficace