我可以比较不同顺序的两个词典的键吗?

时间:2015-04-29 13:11:11

标签: python dictionary compare

我道歉这必须是使用词典的基本问题。我正在学习python,我的目标是比较两个词典并从两个相同的条目中恢复Key和Value条目。据我所知,字典中的顺序与列表中的顺序无关。但我采用了一个代码来比较我的词典,我只是想确保词典的顺序无关紧要。

到目前为止我写的代码是:

def compare_dict(first,second): 
    with open('Common_hits_python.txt', 'w') as file: 
            for keyone in first: 
                for keytwo in second: 
                    if keytwo == keyone: 
                        if first[keyone] == second[keytwo]: 
                            file.write(keyone + "\t" + first[keyone] + "\n") 

任何建议都将不胜感激。我为上面的代码中的冗余道歉。但是,如果有人能够确认以这种方式比较两个字典并不要求密钥处于相同的顺序就会很棒。其他编写函数的方法也非常受欢迎。

3 个答案:

答案 0 :(得分:7)

由于您遍历两个词典并比较所有组合,否则顺序无关紧要。最终,将一个字典中的每个键与另一个字典中的每个键进行比较。

然而,测试匹配键不是一种非常有效的方法。测试密钥是否存在就像keyone in second一样简单,无需在second处遍历所有密钥。

更好的是,您可以改为使用集合交叉点:

for key, value in first.viewitems() & second.viewitems():
    # loops over all key - value pairs that match in both.
    file.write('{}\t{}\n'.format(key, value)) 

这使用dictionary view objects;如果您使用的是Python 3,则可以使用first.items() & second.items()作为词典,默认情况下会返回字典视图。

使用dict.viewitems()作为一个集仅在值可以哈希时才有效,但是因为在写入我认为是的文件时你将值视为字符串。

如果您的值可以使用,则需要验证值是否匹配,但您仍然可以使用视图并仅与键相交:

for key in first.viewkeys() & second.viewkeys():
    # loops over all keys that match in both.
    if first[key] == second[key]:
        file.write('{}\t{}\n'.format(key, first[key])) 

同样,在Python 3中,按键使用first.keys() & second.keys()表示两个词典的交集。

答案 1 :(得分:2)

您这样做的方式是有效的。在查看两个列表时,字典的顺序无关紧要。 您可以这样做,以优化您的代码。

for keyone in first: 
    if keyone in second: # returns true if keyone is present in second.
        if first[keyone] == second[keyone]:
             file.write(keyone + "\t" + first[keyone] + "\n") 

答案 2 :(得分:1)

字典的键实际上是一个集合,Python已经有一个带有高效intersection方法的内置集类型。这将产生一组两个词典共有的键:

dict0 = {...}
dict1 = {...}
set0 = set(dict0)
set1 = set(dict1)
keys = set0.intersection(set1)

您的目标是使用这些键构建字典,这可以通过字典理解来完成。它需要一个条件来阻止两个原始词典中具有不相等值的键:

new_dict = {k: dict0[k] for k in keys if dict0[k] == dict1[k]}

根据您对新词典的预期用途,您可能希望copy or deepcopy将旧词典的值添加到新词典中。