サムネがコーヒーの記事は書きかけです。

リスト内包表記でコードを簡略化

pythonでアルゴリズムを書いていると、データを保管するために空のリストを前もって作っておくことがよくあります。そんな時、リスト内包表記を使えばコードをかなり簡潔に書くことができます。

繰り返し表現

例えば、リストに1から100までを順に追加したい場合。

従来の表現で書くと、

list = []
for i+1 in range(100):
    list.append(i)

というふうになりますが、これを内包表記で書くと

list = [i+1 for i in range(100)]

このように一行で書くことができてしまいます。

条件分岐

例えば、iに数を代入していって、iが奇数の時だけリストに追加するというコードを書くとします。

もちろん、以下のように奇数の定義に従ってコードを書けば良いのですが、今回は条件分岐を使って書いてみたいと思います。

list = []
for i in range(100):
    list.append(2*i+1)

上記のコードを、条件分岐で書き換えます。

for i in range(100):
    if i%2 ==1:
        list.append(i)

この処理を内包表記で表すと、

list = [i for i in range(100) if i%2==1]

このように一行で書くことができます。

if以下の条件がTrueの時にリストに指定の値が追加される仕組みです。

では、elseが来たときはどうなるでしょうか。

ここでは、奇数の時はそのままiを追加し、それ以外の時は0を追加するコードを書いてみます。

list = [i if i%2 == 1 else 0 for i in range(100)]

ORFへの応用

上記の記事でORFを取得する関数を作成しましたが、そのコードを一行で書けそうだったため、改めて描き直してみたいと思います。

以下が、本来のコードです。

def get_orfcandidates(seq_raw):
    candidates = []
    for i in range(3):
        seq_i = Seq(seq_raw).transcribe()[i:].replace('\n','').replace(' ','')
        if len(seq_i)%3 == 1:
            seq_i = seq_i[:-1]
        elif len(seq_i)%3 == 2:
            seq_i = seq_i[:-2]
        else:
            pass
        candidates.append(seq_i.translate())
    return candidates

ここでの条件分岐は、コドンは3ヌクレオチドペアでしか意味を持たないため、mRNA配列のbp数が3の倍数になっていなければならないということを意味しています。

しかし、Biopythonで翻訳してみると、余ったヌクレオチドは自動的に無視される仕様になっていることに気づいたので、どうやら条件分岐を外すことができるようです。

よって、関数を一行で書き直すと

def get_orfcandidates(seq_raw):
    candidates = [Seq(seq_raw).transcribe()[i:].replace('\n','').replace(' ','') for i in range(3)]
    return candidates

というようになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です