我一直在使用Python字典用COG/NOG标识符替换md5值。这就是我到目前为止所做的。。。你知道吗
#!/usr/bin/python
import sys
fil = sys.argv[1]
# load md5 -> COG into dictionary
with open(fil) as fin:
rows = ( line.strip().split('\t') for line in fin )
d = { row[0]:row[1] for row in rows }
# open blast output, replace md5 with COG by looking up md5 in the dictionary
blasted = open(sys.argv[2])
for line in blasted:
linearr = line.split()
if linearr[2] > '90.00':
line.split()
needed = linearr[0:2]
md5 = linearr[1]
ret = []
for md5 in needed:
ret.append(d.get(md5,md5))
"".join(ret)
print ret
这把我带到这个输出,各种大小和内容的列表。。。你知道吗
['fig|357276.26.peg.4486']
['fig|357276.26.peg.4486', 'f3e68ef307f962ba6b836a94ff0e2216']
['fig|357276.26.peg.4486']
['fig|357276.26.peg.4486', 'COG0860']
['fig|357276.26.peg.4486']
['fig|357276.26.peg.4486', '05e94199eef6fbaf225618f9deaf847c']
因此,需要抛出单个项目列表以及保留md5值的列表。我需要的是只为包含COG/NOG第二个元素的列表选择,如上面的第四个列表中所示。你知道吗
我无法选择列表的第二项来筛选这些结果,因为并非所有列表都有第二项。有人能建议一种方法吗?你知道吗
更新: 我只能删除只有一个项目的列表。现在我的名单是这样的。。。你知道吗
['fig|357276.26.peg.4485', 'NOG73961']
['fig|357276.26.peg.4485', '19c060b530e8fa9598de068387bc3225']
['fig|357276.26.peg.4486', '8daa25fe83eb1a204c51861cb77945f5']
['fig|357276.26.peg.4486', '5c253078a0a6c51eca320dfd92991a70']
['fig|357276.26.peg.4486', '8707bd7fa7489ff69233ce735c1c6cbf']
['fig|357276.26.peg.4486', 'f3e68ef307f962ba6b836a94ff0e2216']
['fig|357276.26.peg.4486', 'COG0860']
['fig|357276.26.peg.4486', '05e94199eef6fbaf225618f9deaf847c']
现在我只需要选择包含以NOG或COG开头的第二项的列表…有什么建议吗?你知道吗
在尝试访问第二个元素之前,只需使用len()检查列表是否足够长。你知道吗
[编辑:就像上面的第一条评论一样,是在我开始回答这个问题后发布的。(我没有足够的声誉来评论自己。)]
[编辑2:这里有一些关于您的代码的注释。除非您确定数据的来源,否则您可能需要考虑进行一些检查,以确保每一行都符合您的需要。]
如果您的列表存储在
variable
ret
中,那么您可以使用此列表理解来实现您需要的:输出:
如果
ret
有i[1]
以NOD
开头的元素,那么new_ret
也将包含这些元素。你知道吗假设你有一个列表,比如
values = [ [1], [1,2], [3,4] ]
首先,使用
filter
函数删除所有项:现在您需要根据COG/NOG进行过滤。由于现在只有两个元素的列表,我们可以直接选择第二个元素:
为了简化整个过程,我们可以将两者合并:
相关问题 更多 >
编程相关推荐