2010-03-19 26 views
5

¿Hay alguna forma de añadir elementos a una lista azar, construido en función dePython | Cómo añadir elementos a una lista azar

ejemplo:

def random_append(): 
    lst = ['a'] 
    lst.append('b') 
    lst.append('c') 
    lst.append('d') 
    lst.append('e') 
    return print lst 

esto hacia fuera puesto ['a', 'b', 'c', 'd', 'e']

Pero quiero para agregar elementos al azar y poner algo como esto: ['b', 'd', 'b', 'e', 'c']

Y sí, hay una función random.shuffle() pero se baraja una lista de una una vez que no lo necesito, solo quiero realizar inserciones aleatorias.

+1

¿Hay supone que es de dos 'B'' s en la salida? –

+1

Mezclar una lista completa es probablemente más escalable que las inserciones aleatorias. (No sé exactamente cuáles son tus necesidades en esta publicación, a decir verdad.) –

+1

¿Puedes ser más específico acerca de cómo debería funcionar esta _aplicaciones aleatorias_? ¿Conoces la cantidad de elementos a priori? –

Respuesta

7

Si necesita realizar solo inserto en una posición aleatoria entonces el exapmle trivial ya dada funciona:

from random import randrange, sample 

def random_insert(lst, item): 
    lst.insert(randrange(len(lst)+1), item) 

Sin embargo, si es necesario insertar k artículos a una lista de longitud n continuación, utilizando el la función dada previamente es O (n * k + k ** 2) complejidad. Sin embargo insertar varios elementos se puede hacer en tiempo O lineal (n + k) si se calcula las posiciones de destino antes de tiempo y volver a escribir la lista de entrada de una sola vez:

def random_insert_seq(lst, seq): 
    insert_locations = sample(xrange(len(lst) + len(seq)), len(seq)) 
    inserts = dict(zip(insert_locations, seq)) 
    input = iter(lst) 
    lst[:] = [inserts[pos] if pos in inserts else next(input) 
     for pos in xrange(len(lst) + len(seq))] 
10

Si no se supone que es exactamente uno de cada elemento

>>> from random import randint 
>>> a=[] 
>>> for x in "abcde": 
... a.insert(randint(0,len(a)),x) 
... 
>>> a 
['b', 'a', 'd', 'c', 'e'] 

Si usted está permitiendo que los duplicados (como la salida indica)

>>> from random import choice 
>>> a=[choice("abcde") for x in range(5)] 
>>> a 
['a', 'b', 'd', 'b', 'a'] 
+5

Tenga en cuenta que esto es O (n^2) y poblar 'a' luego usar' random.shuffle' es O (n). –

+0

@Mike Graham, presumiblemente el OP quiere hacer algo con la lista entre inserciones, ya que no quieren usar el orden aleatorio. –

+0

@gnibbler, realmente me cuesta entender exactamente lo que OP quiere de la descripción tal como está. A medida que el axioma de Python va, * En vista de la ambigüedad, rechaza la tentación de adivinar. *. –

6

random.shuffle es probablemente la mejor herramienta para el trabajo. Es simple, obvio y bien nombrado; probablemente sea más legible que las otras sugerencias que obtendrá. Además, usarlo es O (n), pero usar insert (una operación O (n)) n veces es cuadrático.

0
from random import choice 

n=10 
seq=['a','b','c','d'] 
rstr=[choice(seq) for i in range(n)] 
Cuestiones relacionadas