2017-09-22 14 views
-1

J'essaie de créer un script qui donne des informations. J'ai besoin de compter les éléments d'une liste demandée à l'utilisateur. Mais j'ai des problèmes avec certains éléments. Par exemple, étant donné une séquence d'ADN, j'ai besoin de la longueur, du nombre de nucléotides et de leur type. Par exemple, dans une séquence comme: AATTAaCCGg la sortie doit être:Comment obtenir différents éléments d'une chaîne avec la méthode count

Adenine = 4 (count A and a) 
Thymine = 2 
Cytosine = 2 
Guanine = 2 

C'est là où je suis coincé:

sequence = str(input('Enter DNA sequence:')) 
print ('Your sequence contain:',len(secuencia), 'bases', 'with the following structure:') 
adenine = sequence.count("A" or "a") 
thymine = sequence.count("T" or "t") 
cytosine = sequence.count("C" or "c") 
guanine = sequence.count ("G" or "g") 

print("adenine = ", adenine) 
print("thymine = ", thymine) 
print("cytosine = ", cytosine) 
print("guanine = ", guanine) 

Mais la partie sequence.count ne fait pas de distinction entre « A » et « ". J'ai essayé avec les structures "et" et "ou" mais cela ne semble pas fonctionner.

Par ailleurs, cela peut-il être résolu avec un dictionnaire comme celui-ci:

dicc = {adenine:"A" and "a", thymine:"T" and "t", 
     cytosine:"C" and "c", guanine:"G" and "g"} 
+0

Ce qui est avec toutes les marques "' ". Vous n'en avez pas besoin si vous utilisez le formatage du code. –

+3

Ne devrait pas être 'Adenine = 4 (compte A et a)' dans l'échantillon (comme je compte 4 A)? Si c'est le cas, vous pouvez utiliser la méthode 'sequence.lower()', puis compter uniquement le 'a' et ainsi de suite. – arsho

Répondre

0

Il suffit de trouver séparément et résumer:

... 
adenine = sequence.count("A") + sequence.count("a") 
thymine = sequence.count("T") + sequence.count("t") 
cytosine = sequence.count("C") + sequence.count("c") 
guanine = sequence.count ("G") + sequence.count("g") 
... 

Ou faire minuscules toute chaîne, compte :

... 
sequence.lower() 
adenine = sequence.count("a") 
thymine = sequence.count("t") 
cytosine = sequence.count("c") 
guanine = sequence.count("g") 
... 
-1

Vous devriez compter comme ceci. Peut-être un peu exagéré, mais c'est clair comme de l'eau.

sequence=input('Give me a DNA:') 
count_a = 0 
count_t = 0 
count_c = 0 
count_g = 0 

for each_letter in sequence.lower(): 
    if 'a' in each_letter: 
     count_a += 1 
    elif 't' in each_letter: 
     count_t += 1 
    elif 'c' in each_letter: 
     count_c += 1 
    elif 'g' in each_letter: 
     count_g += 1 

print('The counters are: \n -%s \n -%s \n -%s \n -%s \n', (count_a,count_t,count_c,count_g)) 
+0

totalement exagéré. OP 'ne devrait pas' faire comme ça et comment est-il encore plus clair que construit dans la fonction de comptage? – arsho

+0

@arsho Jamais dit "C'est plus clair" que tout. Je viens de dire qu'il est clair que c'est clair pour lire. – dmb

+0

comment une boucle + comptage est plus clair à lire que 'str.count ('a')'? – arsho

1

ce serait mal à adenine = sequence.count("A") + sequence.count("a")? Le or ne va pas être accepté comme argument à la fonction sequence.count. Python va évaluer or en tant qu'opérateur logique. les chaînes telles que "A" et "a" sont des valeurs "véridiques". Donc, ce qui se passe ici, c'est que vous appelez sequence.count(True), et cela ne vous donne certainement pas les résultats que vous attendez. Sans créer votre propre fonction pour compter le nombre de fois "A" ou "a" apparaît dans une chaîne, alors vous devriez traiter les valeurs retournées. Ici, ils sont des entiers, vous pouvez donc simplement les ajouter. Cela signifie que le programme doit rechercher deux fois la chaîne pour trouver les caractères, mais cela n'a pas d'importance pour un programme comme celui-ci.

0

Vous pouvez utiliser collections.Counter compter l'apparition de chaque lettre:

import collections 

sequence = input('Enter a DNA sequence: ') 
counter = collections.Counter(sequence) 
print(counter) 

Par exemple:

Enter a DNA sequence: AATTAaCCGg 
Counter({'A': 3, 'C': 2, 'T': 2, 'G': 1, 'a': 1, 'g': 1}) 

Mais si l'on considère que "A" est similaire à "un", vous pouvez ignorer le boîtier:

sequence = input('Enter a DNA sequence: ') 
counter = collections.Counter(sequence.upper()) 
print(counter) 

Vous obtenez:

Enter a DNA sequence: AATTAaCCGg 
Counter({'A': 4, 'C': 2, 'T': 2, 'G': 2}) 
+0

ouais c'est une assez bonne solution, mais elle peut interférer avec vos résultats lorsque la séquence d'ADN comprend des lettres qui ne sont ni ATCG ni atcg – Fence

+0

@Fence Bien sûr, mais c'est un autre problème que vous pouvez vérifier facilement: 'affirmer tout (c. upper() dans "ACTG" pour c dans la séquence). –