2014-06-13 70 views
0

我已經開始了生物信息學教學平臺Roaslind。我正在嘗試解決第一個問題。這是我已經結束的代碼:在if語句中設置變量

#!/usr/bin/python -tt 

def count_nuc(): 

    '''Usage: count_nuc()''' 

    s = raw_input('Enter nucleotide string: ') 
    if s.isalpha():   
     if len(s) < 1000: 
      for letter in s: 
       if letter.upper() == 'A': 
        a = s.count('A') 
       elif letter.upper() == 'C': 
        c = s.count('C') 
       elif letter.upper() == 'G': 
        g = s.count('G') 
       elif letter.upper() == 'T': 
        t = s.count('T') 
       else: 
        print('Error') 
      print '%d %d %d %d' % (a, c, g, t) 
     else: 
      print('String must be 1000 nucleotides or less.') 
      count_nuc() 
    else: 
     print('String must of nucleotides must only contain alphabetic characters.') 
     count_nuc() 

它工作正常。大多。我遇到的問題有點愚蠢。我使用字符串的count方法來計算特定類型的核苷酸數量,然後將該數字分配給我的變量。然而,如果沒有這樣的核苷酸存在(即,我給它一個字符串像'ATGTTT',那麼我的變量'c'永遠不會被定義和打印語句barfs。我已經考慮過這個,沒有我能想到的讓我得到我曾想過在打印出來之前檢查變量是否存在,但這對我來說似乎很笨拙,我不確定這是否會被認爲是適當的編碼禮儀。

+0

注意,你指望*所有* A的爲字符串中的每個* A,這是相當浪費的。 –

回答

1

一種解決方案可能是將所有在循環之前變量爲零

,例如:

a = c = g = t = 0

+1

他們很重要,所以'0'而不是'''',但初始化是好的。 – jonrsharpe

+0

男孩,現在我覺得很蠢,完美的工作!謝謝! – Yanni

+0

不客氣:)接受答案表示讚賞! ;) – Reloader

0

您也可以做

a = s.count('A') if letter.upper() == 'A' else 0 

移動邏輯「內聯」。

3

你的計算算法做了大量的工作,而不是必要的。在迭代過程中,每次看到"A"時,都會計算序列中的所有"A"。相反,你可以跳過迭代,只是做每一個計數的無條件一次(如果算上未出現在字符串中的東西,你會得到一個0):

if len(s) < 1000: 
    a = s.count('A') 
    c = s.count('C') 
    g = s.count('G') 
    t = s.count('T') 
    print '%d %d %d %d' % (a, c, g, t) 

如果你想要做的手動計數,您需要更改您的分配。初始化變量0,然後添加一個到合適的一個,當你看到相關的信:

if len(s) < 1000: 
    a = c = g = t = 0 
    for letter in s: 
     if letter.upper() == 'A': 
      a += 1 
     elif letter.upper() == 'C': 
      c += 1 
     elif letter.upper() == 'G': 
      g += 1 
     elif letter.upper() == 'T': 
      t += 1 
     else: 
      print('Error') 
    print '%d %d %d %d' % (a, c, g, t) 

或者,更好,讓Python's standard library do the counting for you

from collections import Counter 

if len(s) < 1000: 
    counts = Counter(s) 
    print "{A} {C} {G} {T}".format(counts) 
+0

謝謝你的洞察力的批評。到目前爲止,我只做了一個星期左右的工作,從來沒有聽說過收藏或計數器,但是您的解決方案似乎確實節省了大量打字工作。非常感謝您對初學者查詢的友好輸入。 – Yanni