Tengo una cadena de la siguiente manera.

str_main='ATGCAGCACTAGGCAGCACTATGAAGCACTATGCTGCACT'
len(str_main)
40

Quiero extraer tres subcadenas de str_main de modo que cada subcadena contenga 20 caracteres.

Estas subcadenas deben comenzar desde cualquier lugar de la cadena principal y, por lo tanto, obviamente habrá una superposición entre las subcadenas.

Encontré algunas soluciones pero no proporcionan extracción aleatoria de subcadenas de la cadena principal.

La salida deseada puede ser:

substr_1='ATGCAGCACTAGGCAGCACT'
substr_2='CACTATGAAGCACTATGCTG'
substr_3='CACTAGGCAGCACTATGAAG'

Se extraen al azar de la cadena principal. Debería poder extraer tantas cadenas como quiera, ya que se permite la superposición.

0
Abdul Karim Khan 11 oct. 2019 a las 08:38

3 respuestas

La mejor respuesta

Podemos escribir una función y usarla tres veces así:

import random


def get_random_str(main_str, substr_len):
    idx = random.randrange(0, len(main_str) - substr_len + 1)    # Randomly select an "idx" such that "idx + substr_len <= len(main_str)".
    return main_str[idx : (idx+substr_len)]


main_str='ATGCAGCACTAGGCAGCACTATGAAGCACTATGCTGCACT'
print(get_random_str(main_str, 20))
print(get_random_str(main_str, 20))
print(get_random_str(main_str, 20))
1
Dipen Dadhaniya 11 oct. 2019 a las 05:57

Dado que cada subcadena debe tener 20 caracteres, el valor máximo para el límite inferior de la subcadena es la longitud de la cadena menos 21 (la indexación comienza en 0, por lo que debemos restar 1 más, ya que la longitud se basa en 1 y no en 0)

lower_bound_max = len(str_main) - 21

Luego solo necesita generar números aleatorios entre 0 y este valor para obtener la banda inferior de su segmento aleatorio y agregar 20 para obtener la banda superior

import random

lower_bound_max = len(str_main) - 21
for _ in range(3):  # repeat 3 times
    x = random.randint(0, lower_bound_max)
    print(str_main[x:x+20])
1
Iain Shelvington 11 oct. 2019 a las 05:49

Se trata de cortar tu cadena:

str_main_1[:20] o str_main_1[2:22]

Pruebe algo como esto:

for i in range(0, len(str_main_1)):
    print(str_main_1[i, i+20])
1
Alex 11 oct. 2019 a las 05:45
58334846