¿Generando cadenas ‘aleatorias’ desde una cadena diferente en python?

Estoy tratando de generar una cadena aleatoria utilizando los elementos de una cadena diferente, con la misma longitud.

Ej.) Cuerda: AGAACGC

Quiero una cadena aleatoria usando solo elementos de la cadena de arriba

Ahora mismo tengo:

import random seq = 'AGAACGC' length = len(seq) for blah in range(len(seq)): #Apologies for the lame variable names x = random.randint(0,length - 1) print seq[x] 

Y por supuesto esto me dará algo como:

UNA

UNA

sol

UNA

do

UNA

UNA

¿Cómo alteraría el progtwig para que imprima mi cadena aleatoria en una línea?

Espero una respuesta relativamente simple, ya que todavía soy un principiante en python, así que no quiero ser demasiado elegante. Pero cualquier ayuda sería apreciada.

¿Y hay una manera de repetir el número de veces al azar ‘n’?

Decir que en lugar de 1 cadena aleatoria, quería 4 cadenas aleatorias en diferentes líneas. ¿Hay una manera fácil de hacer esto? (Mi nueva mente me está diciendo que repita el bucle ‘n’ veces … pero debe ser un número variable de cadenas aleatorias)

Perdón por preguntar. Realmente apreciaría alguna ayuda. Estoy atascado en un problema mayor porque no sé cómo hacer estos pasos.

En Python 3, hay una forma sencilla de imprimir un carácter sin una nueva línea, pero en Python 2, no lo hay. * Entonces, la forma más sencilla de hacer esto es construir la cadena y luego imprimirla al final:

 result = '' for blah in range(len(seq)): #Apologies for the lame variable names x = random.randint(0,length - 1) result += seq[x] print result 

* Hay dos formas menos simples: puede usar from __future__ import print_function y luego usar print syntax de print Python 3 en lugar de Python 2, o puede usar sys.stdout.write(seq[x]) para cada carácter y luego sys.stdout.write('\n') y sys.stdout.flush() al final. Pero no creo que quieras ninguno de esos.


Sin embargo, hay varias formas de mejorar esto:

  • Use randrange(length) lugar de randint(0, length - 1) .
  • Use random.choice(seq) lugar de usar randrange o randint en primer lugar.
  • Use _ lugar de blah para las variables “no importa”. *
  • Si no te importa lo que estás iterando, solo que estás iterando una vez para cada personaje, solo hazlo for _ in seq: no for _ in range(len(seq)):
  • Construye una lista de letras, luego llama ''.join() al final, en lugar de construir una cadena.
  • Utilice una comprensión en lugar de un bucle explícito.

Poniendo todo junto:

 print ''.join(random.choice(seq) for _ in seq) 

* A menos que estés usando gettext para i18n, o algo más que le dé a _ un significado especial. La mayoría de los proyectos que hacen eso tienen su propia convención para los nombres “no importa”, tal vez __ , o dummy . Y, por supuesto, blah estaría bien para un proyecto de este tipo, siempre y cuando lo utilices de manera consistente.


En cuanto a repetirlo, tu nueva mente tiene razón; sólo tiene que utilizar un bucle. Por ejemplo (tomando la segunda versión, pero funcionará igual de bien con la primera):

 n = 4 for _ in range(n): print ''.join(random.choice(seq) for _ in range(len(seq))) 

Eso va a imprimir 4 cadenas aleatorias diferentes. Y si establece n en 100, imprimirá 100 cadenas aleatorias diferentes.

Es posible que desee escribir esto en una función:

 def print_random_strings(seq, n): for _ in range(n): print ''.join(random.choice(seq) for _ in range(len(seq))) 

Y luego puedes llamarlo como:

 print_random_strings(seq, 4) 

Pero de cualquier manera, tu intuición básica va por buen camino.

Eso es exactamente lo que significa random.sample :

 import random seq = 'AGAACGC' "".join(random.sample(seq, len(seq))) # Gives you something like: 'CGAAACG'