在Python中找出列表和字典之间的共同元素

1 投票
2 回答
699 浏览
提问于 2025-04-18 09:41

我有两个文件,

一个是蛋白质的列表 -

TRIUR3_05947-P1
TRIUR3_06394-P1
Traes_1BL_EB95F4919.2

另一个是一个包含制表符分隔的拼接序列和蛋白质的字典 -

contig22 TRIUR3_05947-P1
contig15 TRIUR3_05947-P1
contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2
contig45 MLOC_71599.4

我想要的结果是找到所有共同的蛋白质,并像这样打印结果,

contig22 TRIUR3_05947-P1
contig15 TRIUR3_05947-P1
contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2

下面是我的脚本,但它只给我返回一次共同的键,我想这可能是因为覆盖了,那我该怎么解决呢?

f1=open('mydict.txt','r')
f2=open('mylist.txt','r')
output = open('result.txt','w')
dictA= dict()
for line1 in f1:
    listA = line1.rstrip('\r\n').split('\t')
    dictA[listA[1]] = listA[0]

for line1 in f2:
    new_list=line1.rstrip('\n').split()
    query=new_list[0]
    if query in dictA:
        listA[0] = dictA[query]
        output.write(query+'\t'+str(listA[0])+'\n')

2 个回答

1

在你的第一个for循环中,你在把txt文件转换成Python字典的时候,丢失了一些信息:

for ...:
    dictA[listA[1]] = listA[0]

举个例子,如果你的txt文件里有这些行:

contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2

那么最后得到的字典只会包含最后一条记录的键值对,而且是反过来的。

为了实现你的目标,只需对程序做一些小改动,可以尝试:

from collections import defaultdict

f1=open('mydict.txt','r')
f2=open('mylist.txt','r')
output = open('result.txt','w')
dictA= defaultdict(list)

for line1 in f1:
    listA = line1.rstrip('\r\n').split('\t')
    dictA[listA[1]].append(listA[0])  # Save all the common proteins

for line1 in f2:
    new_list=line1.rstrip('\n').split()
    query=new_list[0]
    if query in dictA:
        listA = dictA[query]  # Now have a list of matching contigs
        for contig in listA:
            output.write(contig + '\t' + query +'\n')
1

你这样做是反着来的。如果你把“字典文件”存储在一个字典结构里,用蛋白质名称作为键,这样会丢失一些信息。

更好的方法是,先读取蛋白质的列表,把所有的蛋白质名称存储在一个集合里。然后,再读取字典文件,打印出所有那些蛋白质名称在集合里的行。

with open('mylist.txt') as mylist:
    proteins = set(line.strip() for line in mylist)

with open('mydict.txt') as mydict, open('result.txt', 'w') as output:
    for line in mydict:
        _, protein = line.strip().split()
        if protein in proteins:
            output.write(line)

撰写回答