2010-04-06 19 views
7

Me gustaría cortar letras al azar de una cadena.Python: Escogiendo un elemento sin reemplazo

Dadas s = "Hola"

me gustaría recoger elementos de 's' sin reemplazo, pero mantener el número de índice.

Por ejemplo

>>> random.sample(s,len(s)) 
['w', 'h', 'o', 'd', 'y'] 

está cerca de lo que yo quiero, sino que en realidad prefieren algo así como

[('w', 2'), ('h', 0), (' o ', 1), (' d ', 3), (' y ', 4)]

con pares de letras y índices. Esto es importante porque la misma letra aparece en "s" más de una vez. es decir, "letra", donde "t" aparece dos veces, pero necesito distinguir la primera "t" de la segunda.

Idealmente, en realidad solo necesito generar/seleccionar letras cuando las necesito, pero mezclar y calcular todas las letras a la vez (es decir, en una lista como la mostrada arriba) está bien.

Respuesta

16
>>> random.sample(list(enumerate(a)), 5) 
[(1, 'o'), (0, 'h'), (3, 'd'), (2, 'w'), (4, 'y')] 
8

Se podía enumerar la lista antes del muestreo:

>>> random.sample(list(enumerate(l)), 5) 
[(1, 'o'), (2, 'w'), (0, 'h'), (3, 'd'), (4, 'y')] 
3

Es probable que sea más fácil hacer algo como esto:

def sample_with_indices(s): 
    indices = range(len(s)) 
    random.shuffle(indices) 
    return [(s[i], i) for i in indices] 

Esto básicamente mezclar todos los índices de una cadena y luego simplemente devuelve el personaje en ese índice. Pasar de personaje a índice es un poco más difícil.

+1

Iba a sugerir algo similar, pero deberías usar el truco 'list (enumerate (s))' anterior: 'return random.shuffle (list (enumerate (s)))' – jemfinch

+0

Sí, el único beneficio esto realmente proporciona si, por el contrario, quiere hacer algo funky seleccionando qué índices quiere usar en su lugar y luego puede hacer eso seguido de las dos últimas líneas aquí. –