【问题标题】:can I compare the keys of two dictionaries that are not in the same order?我可以比较两个不同顺序的字典的键吗?
【发布时间】:2015-04-29 13:11:10
【问题描述】:

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

目前我写的代码是:

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

任何建议将不胜感激。对于上面代码中的冗余,我深表歉意。但是,如果有人可以确认以这种方式比较两个字典不需要键的顺序相同,那就太好了。其他编写函数的方式也将不胜感激。

【问题讨论】:

  • 这段代码现在对你有用吗?
  • 是的,我检索到的输出看起来正确,但它对于两个词典来说是一个相当大的数据集(大约 74,000 行),所以我想看看其他人是否看到相同的逻辑。

标签: python dictionary compare


【解决方案1】:

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

但是,这并不是测试匹配键的一种非常有效的方法。测试一个键是否存在就像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() 键对两个字典进行交集。

【讨论】:

    【解决方案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") 
    

    【讨论】:

    • 在python中,对于cmets,使用#而不是//
    【解决方案3】:

    字典的键实际上是一个集合,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 旧字典的值添加到新字典中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2015-03-31
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多