• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

[Python] Comparação de sequências e devolve sequência resultado

1 mensagem neste tópico

Encontrei aqui um script antigo que tinha feito quando comecei a aprender Python.

Ainda está muito verde (vinha de Pascal e nota-se bem a influência) mas mostra como fazer um programa simples que tem pedido de dados ao utilizador, validação dos dados, uma função, condicionais, ciclos, listas, strings e dicionarios. Pode ser que dê jeito a alguém... aqui vai :)

"""Script para ler uma serie de sequencias de igual tamanho e devolver uma
sequencia-resultado cujas bases sejam as mais frequentes nas fornecidas pelo utilizador

NOTA: O programa nao diferencia entre bases com contagens iguais"""

## Algoritmo
## 1. Pedir sequencias ao utilizador ate este introduzir espaco em branco
## 2. Avaliar o comprimento e qualidade das sequencias
## 3. Avaliar, em matriz, as bases mais frequentes, posicao a posicao
## 4. Produzir a sequencia-resultado
## 5. Apresentar ao utilizador a sequencia-resultado

## Funcoes e Classes

def consensus(ls_seqs_u):
## Avaliar comprimento das sequencias
for i in range(len(ls_seqs_u)):
	if len(ls_seqs_u[0]) == len(ls_seqs_u[i]):
		length_test = 1
		seq_length = len(ls_seqs_u[i])
	else:
		print 'Sequencias de comprimentos diferentes!'
		length_test = 0
		break

## Avaliar qualidade das sequencias (se contem bases para alem de A, T, C e G)

if length_test:
	for i in range(len(ls_seqs_u)):
		my_seq = ls_seqs_u[i]
		for j in range(len(my_seq)):
			if my_seq[j] not in ['A', 'C', 'T', 'G', 'a', 'c', 't', 'g']:
				print 'ERRO: Base',j+1,'da sequencia',i+1,'desconhecida:',my_seq[j]
				base_test = 0
				break
			else:
				base_test = 1

## Construir matriz de sequencias e avaliar bases
	if base_test:
		global seq_resultado # define a variavel como global

		for i in range(seq_length): # itera o comprimento das sequencias
			base_a = base_t = base_c = base_g = 0 # inicia contagem das bases para a posicao i
			for j in range(len(ls_seqs_u)): # itera a posicao i das sequencias todas (iteracao vertical)
				the_seq = ls_seqs_u[j]
				if the_seq[i] in ['A', 'a']: # conta as bases
					base_a += 1
				if the_seq[i] in ['T', 't']:
					base_t += 1
				if the_seq[i] in ['C', 'c']:
					base_c += 1
				if the_seq[i] in ['G', 'g']:
					base_g += 1
			base_count = [base_a, base_t, base_c, base_g] # armazena contagem numa lista
			base_dict = {base_a:'A', base_t:'T', base_c:'C', base_g:'G'} # associa contagem a nome da base
			base_count.sort() # ordena por ordem crescente a lista das contagens
			base_count.reverse() # reverte a ordem das contagens - a maior contagem vem primeiro
			seq_resultado = seq_resultado+base_dict[base_count[0]] # associa a maior contagem a base certa e insere-a na seq resultado

## PROGRAMA PRINCIPAL

## Pedir sequencias ao utilizador e guardar numa lista

ls_seqs_u = [] # Criar lista para armazenar sequencias
seq_resultado = '' # constroi a seq resultado como uma string

print 'Deixe em branco quando pretender parar de inserir sequencias\nou caso queira sair do programa'

while True: # Ciclo while que so para quando a seq for em branco (comprimento 0)
st_seq = raw_input('Insira a sequencia: ')
if len(st_seq) > 0:
	ls_seqs_u.append(st_seq) # insere a string seq na lista
else:
	break

consensus(ls_seqs_u)

if len(seq_resultado) > 0:
print '\n\nSequencia Resultado:',seq_resultado # imprime o resultado final caso exista

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora