web-dev-qa-db-fra.com

Comment faire une liste de n nombres en Python et sélectionner n'importe quel nombre au hasard?

J'ai compté quelque chose et il est sorti à N.

Maintenant, j'aimerais avoir une liste contenant 0 à N chiffres.

Exemple:

N = 5

alors, count_list = [1, 2, 3, 4, 5]

Comment pourrais-je faire cela?

De plus, une fois la liste créée, j'aimerais sélectionner au hasard un numéro de cette liste et utiliser ce numéro.

Après cela, j'aimerais sélectionner un autre numéro parmi les numéros restants de la liste (N-1), puis l'utiliser également.

Cela continue, la liste est vide.

Comment puis-je faire ceci?

23
Sunny

Vous pouvez créer l'énumération des éléments en procédant comme suit:

mylist = list(xrange(10))

Ensuite, vous pouvez utiliser la fonction random.choice pour sélectionner vos éléments:

import random
...
random.choice(mylist)

Comme Asim Ihsan l’a correctement déclaré, ma réponse n’a pas répondu à l’ensemble du problème du PO. Pour supprimer les valeurs de la liste, il suffit d'appeler list.remove():

import random
...
value = random.choice(mylist)
mylist.remove(value)

Comme l'a fait remarquer takataka, la fonction intégrée xrange a été renommée range en Python 3.

33
Constantinius

Vous pouvez essayer ce code

import random
N = 5
count_list = range(1,N+1)
random.shuffle(count_list)

while count_list:
    value = count_list.pop()
    # do whatever you want with 'value'
7
Tibo

Quant à la première partie:

>>> N = 5
>>> count_list = [i+1 for i in xrange(N)]
>>> count_list
[1, 2, 3, 4, 5]
>>>

Pour le second, lire 9.6. random - Génère des nombres pseudo-aléatoires.

>>> from random import choice
>>> a = choice(count_list)
>>> a
1
>>> count_list.remove(a)
>>> count_list
[2, 3, 4, 5]

C'est l'idée générale.

Au fait, vous pouvez également être intéresséen lecture Sélection aléatoire d'éléments dans une liste, sans répétition (recette Python).

Il existe quelques implémentations de la sélection aléatoire rapide.

1
Gandi

Vous n'avez pas besoin de compter les choses si vous voulez choisir un élément aléatoire. Utilisez simplement random.choice() et transmettez votre itérable:

import random
items = ['foo', 'bar', 'baz']
print random.choice(items)

Si vous devez vraiment les compter, utilisez random.randint(1, count+1).

1
patrys

Vous pouvez utiliser:

import random
random.choice(range(n))

ou:

random.choice(range(1,n+1))

si vous le voulez de 1 à n et non de 0.

1
Guy

Après cela, j'aimerais sélectionner un autre numéro parmi les numéros restants de la liste (N-1), puis l'utiliser également.

Ensuite, vous ne voudrez peut-être pas vraiment créer une liste de nombres de 1 à N uniquement pour en choisir un (pourquoi ne pas simplement demander un nombre aléatoire directement dans cette plage, au lieu de le créer explicitement, à choisir?), Mais au lieu de mélanger une telle liste. Heureusement, le module random vous a également fourni une solution: utilisez simplement random.shuffle.

Bien sûr, si vous avez une longue liste de nombres et que vous ne voulez en tirer que quelques-uns, il est logique de les tracer chacun avec random.choice et de les supprimer.

Mais ... pourquoi voulez-vous sélectionner des nombres dans une plage qui correspond au nombre d'éléments? Allez-vous utiliser le numéro pour sélectionner l'un des éléments? Ne fais pas ça ça fait de votre mieux pour rendre les choses trop compliquées. Si vous souhaitez sélectionner l'un des éléments, faites-le directement, à nouveau avec random.choice.

1
Karl Knechtel

Conservez une set et supprimez un élément pris au hasard (avec choice) jusqu'à ce que la liste soit vide:

s = set(range(1, 6))
import random

while len(s) > 0:
  s.remove(random.choice(list(s)))
  print(s)

Trois points donnent trois réponses différentes:

>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
0
octoback

Créer la liste (modifiée):

count_list = range(1, N+1)

Sélectionnez un élément aléatoire:

import random
random.choice(count_list)
0
pvoosten