2

我有两个制表符分隔的文件。文件中的行数不一样。我已将每个文件的前两列放入字典中。我想将两个文件中相同的(键,值)对放入单独的输出文件中。

例如

dict1 = {'sim3_orf00006': 'gi|224475510|ref|YP_002633116.1|', 'sim3_orf00005': 'gi|224475511|ref|YP_002633117.1|'}
dict2 = {'gi|224475987|ref|YP_002633593.1|': 'sim2_orf00909', 'gi|224477510|ref|YP_002635116.1|': 'sim1_orf00452'}

文件1:

sim2_orf01946    gi|224475611|ref|YP_002633217.1|    100.0

文件2:

gi|224475496|ref|YP_002633102.1|     sim3_orf00019   100.0

更新:谢谢大家的回复

4

5 回答 5

5

使用对集合的交集(key, value)

with open('output_file', 'w') as f:
    for key, value in set(dict1.items()) & set(dict2.items()):
        f.write("%s\t%s" % (key, value))
于 2012-10-16T13:38:27.217 回答
1

无需在内存中创建临时集。字典已经提供了O(1)查找复杂性:

dict1 = {'a':'b', 'c':'d'}
dict2 = {'c':'d', 'e':'f'}

filtered = ((item,value) for (item,value) in dict1.iteritems() if item in dict2 and value==dict2[item])
with open('output_file', 'w') as f:
    for key, value in filtered:
        text = '{}\t{}'.format(key, value)
        print(text)
        f.write(text)

value==dict2[item]item in dict2仅当返回时才会计算,True因为and衬衫电路运算符

此外,重要的是要注意,该解决方案对于第一个字典的长度和第二个字典的长度的复杂性nm通过在第二个字典中查找的n迭代O(1),给出O(n). 因此,如果m小于n,则值得交换字典,因此复杂度将变为O(m)

使用set不会做得更好,因为集合交集s&t具有O(min(len(s), len(t))复杂性。

因此,这种方法将减少内存占用,保持相同的复杂性。

于 2012-10-16T13:55:19.900 回答
1

你可以使用:

for key, d1v in dict1.iteritems():
    try:
        if d1v == dict2[key]:
            pass # it's a match
    except KeyError as e:
        pass # no corresponding key

或者,如果预计重叠较低,则预先计算要比较的键:

for key in (dict1.viewkeys() & dict2.viewkeys()): # use .keys() in 3.x
    if dict1[key] == dict2[key]:
         pass # match
于 2012-10-16T14:09:54.383 回答
0

这将写入您的第三个文件,仅写入两个dicts 中存在的键、值对。但是,如果您想要原始文件中的整行,则需要以不同的方式处理。一种可能的方法是将这些行直接添加到您的行dict中以便更快地查找

outfile = open('path/to/output/file', 'w')
for k,v in dict1.iteritems():
    if k in dict2 and dict2[k]==v:
        outfile.write('\t'.join([k,v]) + '\n')
outfile.close()

希望这可以帮助

于 2012-10-16T13:38:09.030 回答
0
A = {}
B = {}

# put stuff in them

for key in A.keys():
    if key in B.keys() and A[key] == B[key]:
        #write to file

或者

shared_keys = [key for key in A.keys() if key in B.keys() and A[key] == B[key]]
with open("path/to/file", 'w') as writer:
    for key in shared_keys:
        writer.write("Key: %s, A: %s, B: %s" % (key, A[key], B[key]))
于 2012-10-16T13:38:21.093 回答