【问题标题】:Efficient method of intersecting two dictionaries python to get common elements of both dicts if key is same如果键相同,则相交两个字典python以获取两个字典的共同元素的有效方法
【发布时间】:2018-11-29 16:46:06
【问题描述】:

我正在尝试在两个字典中为每个键查找常用项。也许下面的代码可以更好地解释我的目的。我有太多记录,因此这段代码需要很长时间才能运行;有什么方法可以有效地编写它?

rcmd = {'1':{"A","B"},"2":{"A","C"},"3":{"B","C","D"}}   
rmv = {'1':{"C","B"},"2":{"A","C"},"3":{"B","C","A"},"4":{"A"}}

correct_rcmd = []
for i in range(len(rcmd)):
    for j in range(len(rmv)):
        if rcmd.keys()[i] == rmv.keys()[j]:
            correct_rcmd.append(rcmd.values() 
[i].intersection(rmv.values()[j]))
print correct_rcmd

【问题讨论】:

    标签: python python-3.x performance dictionary intersection


    【解决方案1】:

    您永远不应该在字典的键中使用索引 - 特别是如果您使用 python 2.x(正如您使用 print 而没有任何 () 所建议的那样)。

    字典中键的顺序直到 3.6(仅针对作为实现细节的副作用的 CPython)或默认情况下从 python 3.7 开始才固定。

    然后顺序是 插入顺序 - 如果您以 不同 顺序插入键,索引到 keys() 仍然会中断,因为您是混合不同键的值!。

    rcmd = {'1':{"A","B"},"2":{"A","C"},"3":{"B","C","D"}}   
    rmv = {'1':{"C","B"},"2":{"A","C"},"3":{"B","C","A"},"4":{"A"}}
    
    # get all keys that are common in both dictionaries
    # python 2 or 3:
    keys_that_are_same = set(rcmd) & set(rmv)
    # for python 3 better, as it uses the key-sets directly: 
    # keys_that_are_same = rcmd.keys() & rmv.keys()
    
    # loop over both keys and get the intersection into a new dict:
    common = {}
    for key in keys_that_are_same:
        common[key] = rcmd[key] & rmv[key]
    
    # as dict comprehension - no loop needed: 
    # common = {k : rcmd[k] & rmv[k] for k in keys_that_are_same} 
    
    print(common)
    

    输出:

    {'1': set(['B']), '3': set(['C', 'B']), '2': set(['A', 'C'])} # py 2.7
    
    {'1': {'B'}, '2': {'A', 'C'}, '3': {'C', 'B'}}                # py 3.6
    

    这还具有使用更少需要构造和处理的对象以及使用集合来减少开始处理的键数量的好处。如果你在 python 2.

    【讨论】:

    • 你为什么要强制把东西放到一个列表中(必须先创建然后销毁)来测试它是否在列表中(对于集合来说,它需要 O(n) 而不是 O(1)) == 需要更长的时间...我没有感觉 - 完全没有。这是次优的。它是否适用于 100 项:确定 - 是否适用于 1000 万项是的,但如果您要查找的项目是列表中的最后一项,则需要很长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多