2011-12-27 10 views
1

forループを使ってリストを構築したいと思います。スライス表記を使用しようとしています。私の所望の出力は、構造のリストのようになります。forループでスライスを使ってリストを作成する

known_result[i] = (record.query_id, (align.title, align.title,align.title....)) 

しかし、私は仕事にスライス演算子を取得し、トラブルを抱えています。その結果

knowns = "output.xml" 
i=0 
for record in NCBIXML.parse(open(knowns)): 
    known_results[i] = record.query_id  
    known_results[i][1] = (align.title for align in record.alignment)  
    i+=1 

list assignment index out of range. 

私はBioPythonのNCBIXMLモジュールを使って一連のシーケンスを繰り返しますが、問題はリストに追加されています。スライスの使用を変更するか、別の方法で希望のリストを構築する方法について誰かが考えていますか?

おかげでは、CP 1

答えて

2

存在しない指標でlistに値を割り当てることはできません([BIOSTAR]でクロスポスト)

ザック。要素を追加する方法(一般的な使用例であるリストの最後に)は、リストの.appendメソッドを使用することです。上記のコードはテストされていないので、バグが含まれる場合があります。

は、あなたのケースでは、ライン

known_results[i] = record.query_id  
known_results[i][1] = (align.title for align in record.alignment) 

はおそらく

element=(record.query_id, tuple(align.title for align in record.alignment)) 
known_results.append(element) 

警告に変更する必要があります。しかし、その背後にある考え方はうまくいくはずです。

1

用途:

for record in NCBIXML.parse(open(knowns)): 
    known_results[i] = (record.query_id, None)  
    known_results[i][1] = (align.title for align in record.alignment)  
    i+=1 
1

私は右のあなたを取得する場合、あなたはalign.titleに一致するすべてのrecord.query_id一つ以上を割り当てます。だから私はあなたのquery_idsはユニークで、それらのユニークなIDはいくつかのタイトルに関連していると思います。もしそうなら、私はリストの代わりに辞書を提案するでしょう。

辞書はキー(例えばrecord.quer_id)と値(複数可)で構成され(例えばalign.titleのリスト)

catalog = {} 

for record in NCBIXML.parse(open(knowns)): 
    catalog[record.query_id] = [align.title for align in record.alignment] 

このカタログにアクセスするには、反復処理ができ、次のいずれか

for query_id in catalog: 
    print catalog[query_id] # returns the title-list for the actual key 

あなたが探しているものが分かっていれば、直接アクセスすることもできます。

query_id = XYZ_Whatever 
print catalog[query_id] 
+0

いい方法です。それが役に立つと思う。次のステップは、2つのリスト/辞書の内容を繰り返し比較/スコア付けすることで、リストであるか辞書であるかはそれほど重要ではない。辞書を使用するとパフォーマンスが向上しますか? – zach

+0

です。あなたがすべての鍵を使ってループしているのであれば、おそらくそうではありません。いくつかのキーをフィルタリングすることができれば、おそらくはいです。あなたが達成しようとしているものによって異なります。 –