Necesito elegir el número "x" de números aleatorios no repetidos de una lista. Por ejemplo:

all_data = [1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15]

¿Cómo selecciono una lista como [2, 11, 15] y no [3, 8, 8]?

64
George 27 jun. 2011 a las 18:32

6 respuestas

La mejor respuesta

Eso es exactamente lo que random.sample() hace.

>>> random.sample(range(1, 16), 3)
[11, 10, 2]

Editar : estoy casi seguro de que esto no es lo que solicitó, pero me presionaron para incluir este comentario: si la población de la que desea tomar muestras contiene duplicados, primero debe eliminarlos:

population = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
population = set(population)
samples = random.sample(population, 3)
86
Sven Marnach 27 jun. 2011 a las 15:04

Algo como esto:

all_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
from random import shuffle
shuffle(all_data)
res = all_data[:3]# or any other number of items

O:

from random import sample
number_of_items = 4
sample(all_data, number_of_items)

Si all_data puede contener entradas duplicadas, modifique su código para eliminar duplicados primero y luego use shuffle o sample:

all_data = list(set(all_data))
shuffle(all_data)
res = all_data[:3]# or any other number of items
5
Artsiom Rudzenka 27 jun. 2011 a las 14:48
import random
fruits_in_store = ['apple','mango','orange','pineapple','fig','grapes','guava','litchi','almond'] 
print('items available in store :')
print(fruits_in_store)
my_cart = []
for i in range(4):
    #selecting a random index
    temp = int(random.random()*len(fruits_in_store))
    # adding element at random index to new list
    my_cart.append(fruits_in_store[temp])
    # removing the add element from original list
    fruits_in_store.pop(temp)  
print('items successfully added to cart:')
print(my_cart)

Salida:

items available in store :
['apple', 'mango', 'orange', 'pineapple', 'fig', 'grapes', 'guava', 'litchi', 'almond']
items successfully added to cart:
['orange', 'pineapple', 'mango', 'almond']
0
Nino Filiu 5 ene. 2019 a las 14:41

También puede generar una lista de opciones aleatorias, utilizando itertools.combinations y random.shuffle.

all_data = [1,2,2,3,4,5,6,7,8,8,9,10,11,11,12,13,14,15,15]

# Remove duplicates
unique_data = set(all_data)

# Generate a list of combinations of three elements
list_of_three = list(itertools.combinations(unique_data, 3))

# Shuffle the list of combinations of three elements
random.shuffle(list_of_three)

Salida:

[(2, 5, 15), (11, 13, 15), (3, 10, 15), (1, 6, 9), (1, 7, 8), ...]
1
riza 27 jun. 2011 a las 20:37

Otros han sugerido que use random.sample. Si bien esta es una sugerencia válida, hay una sutileza que todos han ignorado:

Si la población contiene repeticiones, cada aparición es una posible selección en la muestra.

Por lo tanto, debe convertir su lista en un conjunto, para evitar valores repetidos:

import random
L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
random.sample(set(L), x) # where x is the number of samples that you want
4
Trufa 27 jun. 2011 a las 14:57

Otra forma, por supuesto, con todas las soluciones, debe asegurarse de que haya al menos 3 valores únicos en la lista original.

all_data = [1,2,2,3,4,5,6,7,8,8,9,10,11,11,12,13,14,15,15]
choices = []
while len(choices) < 3:
    selection = random.choice(all_data)
    if selection not in choices:
        choices.append(selection)
print choices 
1
Joe 27 jun. 2011 a las 18:08