Python将两个字典与每个键的多个值进行比较并检索公共值

时间:2014-08-21 00:57:22

标签: python dictionary intersect

我是初学者,我的代码需要帮助。

我有两个列表格式的文件,我想用作词典。两个文件的格式相同。第1列具有键,第2列具有由“|”分隔的关联值。两个文件中可能不存在所有密钥。

实施例: FILE1.TXT

1   b|c    
2   a|b|d    
3   a|b|c    
4   a|b    
9   a|b|c

FILE2.TXT

1   a|c  
2   a|b|c|d|e    
3   a|b|c    
6   a|b|c    
7   a|b|c    
8   a|b|c    
9   x|y

我想创建一个文件File3.txt,它具有每个键的公共值,并表示每个键。当密钥在两个列表中不常见且“无匹配”时密钥是常见但没有共享共同值的空白单元格。 (最后一部分是事后的想法,所以它不会出现在我的代码中。)

例如: File3.txt

1   c    
2   a|b|d    
3   a|b|c    
4       
6       
7       
8       
9   no matches

以下是我到目前为止编写的代码。我想我完全不喜欢,但感谢任何帮助。谢谢!

#!/usr/bin/env python

table = {}
ref2gene = {}
table2 = {}
ref2gene2 = {}
with open('File1.txt') as f_in:  
    for line in f_in:
        row = line.strip()
        table[line.split('\t')[0]] = line.split('\t')[1]
        gene_name = row[0]        
        for ref in row[1].split('|'):
            ref2gene[ref] = gene_name

with open('File2.txt') as f_1, open('File3.txt', 'w') as f_2:   
    for line in f_1:
        row2 = line.strip()
        table2[line.split('\t')[0]] = line.split('\t')[1]        
        gene_name2 = row2[0]        
        for ref2 in row2[1].split('|'):
            ref2gene2[ref2] = gene_name2

def intersect_two_dicts (table, table2):
    return { k:v for k,v in table.iteritems() if ((k in table2)and(table[k]==table2[k])) }        

print (intersect_two_dicts(dicts[0], dicts[1]))     

1 个答案:

答案 0 :(得分:0)

使用dictonary尝试这种方法我们可以解决此问题,只需将print替换为文件write

file1=open('a.txt','r')
file1=file1.readlines()
file1={i.split()[0]:i.split()[1] for i in file1}
print file1
#{'1': 'a|c', '3': 'a|b|c', '2': 'a|b|c|d|e', '7': 'a|b|c', '6': 'a|b|c', '9': 'x|y', '8': 'a|b|c'}


file2=open('b.txt','r')
file2=file2.readlines()
file2={i.split()[0]:i.split()[1] for i in file2}
print file2
#{'1': 'b|c', '9': 'a|b|c', '3': 'a|b|c', '2': 'a|b|d', '4': 'a|b'}

keys=set(file1.keys()+file2.keys())

for i in sorted(keys):
    if i in file1 and i in file2:
        file1_values=file1[i].split('|')
        file2_values=file2[i].split('|')
        intersec=set(file1_values)&set(file2_values)
        if len(intersec)>0:
            print i,'|'.join(intersec)
        else:print i, 'missing values'
    else:
        print i,'empty'

总产出

1 c
2 a|b|d
3 a|c|b
4 empty
6 empty
7 empty
8 empty
9 missing values