randrange from float choices python list random

python - from - randrange



¿Cómo se selecciona el número "x" de números únicos de una lista en Python? (5)

Necesito elegir el número "x" de números aleatorios no repetitivos 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] ?


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 podría contener entradas duplicadas, modifique su código para eliminar los duplicados primero y luego usar shuffle o sample:

all_data = list(set(all_data)) shuffle(all_data) res = all_data[:3]# or any other number of items


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

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

Edit : Estoy casi seguro de que esto no es lo que pidió, pero me empujaron a 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)


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


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

Si la población contiene repeticiones, entonces 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


También puede generar una lista de opciones aleatorias, usando 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), ...]