繁体   English   中英

在python中查找列表和字典之间的共同元素

[英]Finding common elements between a list and a dictionary in python

我有两个这样的文件,蛋白质列表-

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')

在您的第一个for循环中,将txt文件转换为python字典时,您将丢失信息:

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

例如,如果您有

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

在您的txt文件中,生成的字典将仅具有最后一项的键-值对,即相反。

为了实现您的目标,只需对程序进行最少的修改,请尝试

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')

您执行错误的方法。 如果将“字典文件”存储在字典结构中,并使用蛋白质名称作为键,则会丢失信息。

更好的方法是先读取蛋白质列表,然后将所有蛋白质名称存储在一个集中。 然后,您阅读字典文件并打印其蛋白质名称在集合中的所有行。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM