在for循环中使用切片构建列表

1 投票
3 回答
747 浏览
提问于 2025-04-17 09:05

我想用一个循环来创建一个列表,并且想使用切片的方式。我的目标是得到一个这样的列表结构:

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 个回答

1

如果我理解得没错,你是想给每个 record.query_id 分配一个或多个对应的 align.title。我猜你的 query_ids 是唯一的,这些唯一的 ID 和一些标题是有关联的。如果是这样的话,我建议你使用字典,而不是列表。

字典由一个键(比如 record.query_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]
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

你不能在一个不存在的索引位置给一个 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)

注意:上面的代码没有经过测试,可能会有错误。但它的思路应该是可行的。

撰写回答