在for循环中使用slice来构建列表

时间:2011-12-27 19:44:42

标签: python list slice

我想使用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模块迭代一系列序列,但问题是添加到列表中。有没有人知道如何通过改变切片的使用或通过另一种方法来建立所需的列表?

谢谢zach cp

(在[Biostar]转发)1

3 个答案:

答案 0 :(得分:2)

您无法在不存在的索引处为list分配值。添加元素的方法(在列表的末尾,这是常见的用例)是使用列表的.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 :(得分: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

答案 2 :(得分:1)

如果我说得对,你想要为每个record.query_id分配一个或多个匹配的align.title。所以我猜你的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]