2012-04-28 9 views
1

からの部品、私は次のような文字列を含むファイルを持っている:引っ張る文字列(パイソン)

NM_???? chr12 - 10 110 10 110 3 10,50,100, 20,60,110, 

私は最後の2つの列に興味を持って、最初はexonstartsのカンマseparetedリストと最後であることexonendsのコンマ区切りリストです。私は次のことを行っている、と述べた

fp = open(infile, 'r') 
for line in fp: 
    tokens = line.split() 
    exonstarts = tokens[8][:-1].split(',') 
    exonends = tokens[9][:-1].split(',') 
    zipped = list(zip(exonstarts, exonends)) 

は今、私はこのようになりますリストがあること:

[(10, 20), (50, 60), (100, 110)] 

を私は別の問題を抱えている、私は私が欲しい刺さを持っていますこれらの作品。だから、たとえば、私は望むだろうchr_string[10:20]+chr_string[50:60]+chr_string[100:110]私は簡単にこれを言うことができる方法はありますか?

+0

'[10:20]'や '[10:21]'が必要ですか?スライスの停止インデックスは、包括的ではありません。 –

+0

あなたは正しいです、私は[10:21] –

+0

[クイック基本ループ(python)]の複製をすることができます(http://stackoverflow.com/questions/10359309/quick-basic-loop-python) – Johnsyweb

答えて

2
"".join(chr_string[slice(*exon_interval)] for exon_interval in zipped) 
+0

ジョエル、先週、これで私を助けてくれました。私はあなたのためにもう1つ質問があり、このプログラムは完全に機能するはずです。貴重な質問と一緒に私は答えました。私は新しい開始を得るために染色体の長さから各exonendを引く必要があり、新しい終わりを得るために染色体の長さからexonstartを引く。しかし、私は上記のように各要素についてこれをもう一度行う必要があります。これを行う方法はありますか? –

+0

これは私が言った辞書とコード行を含んでいます: "'.join(chr_string [newstart:newend]のベース用のbc [base.upper()]) –

+0

@PatrickCampbell:好ましくは20文字以下である。 –

4

私はそれを言うための最もPython的な方法があると思う:

''.join(chr_string[a[0]:a[1]] for a in myList) 
+0

右、しかしあらかじめリストに含まれている要素の数がわからないからです。あなたのコード行は2つの要素しか許さないので、これを言う方法はありますか? –

+0

@PatrickCampbell Kenのリストは、リストの各要素を説明します。それぞれのタプルに2つ以上の要素を持つことは理にかなっていません。 – garnertb

+6

これは良いです: ''' .join(開始のchr_string [開始:終了]、myListで終了)' –

1

これらのペアを使用して(私が製作されている)chr_stringをスライスしてlistを取得するには:

>>> [chr_string[start:end + 1] for start,end in zip(exonstarts, exonends)] 
['05060708091', '25262728293', '50515253545'] 

へ一緒に参加してください:

>>> ''.join(chr_string[start:end + 1] for start,end in zip(exonstarts, exonends)) 
'050607080912526272829350515253545' 
関連する問題