Python 字典所有键之间的公共项

Python 字典所有键之间的公共项,python,dictionary,Python,Dictionary,我有一个“259136个键”的字典,每个键都有一个或多个值 我的目标是“在键列表中找到至少有一个值与另一个键相同的键?” 我尝试了不同的方法来解决这个问题,但我一直在寻找更快的解决方案。我试过了 将每个钥匙与259135钥匙进行比较,以检查上述情况 将字典从键值转换为键值,现在值变为键,这样我将有两个字典,我可以转到第一个字典,根据第一个字典中的值从第二个字典中取出所有值 使用集合的dict: d={ 'k1': [1,2,3], 'k2': [2], 'k3'

我有一个“259136个键”的字典,每个键都有一个或多个值

我的目标是“在键列表中找到至少有一个值与另一个键相同的键?”

我尝试了不同的方法来解决这个问题,但我一直在寻找更快的解决方案。我试过了

  • 将每个钥匙与259135钥匙进行比较,以检查上述情况
  • 将字典从键值转换为键值,现在值变为键,这样我将有两个字典,我可以转到第一个字典,根据第一个字典中的值从第二个字典中取出所有值
  • 使用集合的dict:

    d={    'k1': [1,2,3],
           'k2': [2],
           'k3': [10],
           'k4': [3,2]
        }
    
    com_keys={}
    for k, v in d.items():
        for e in v:
            com_keys.setdefault(e, set()).add(k)    
    
    print com_keys   
    # {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k4'])}
    
    然后,如果您只想要具有多个公共密钥的密钥,只需使用dict理解进行过滤(或类似于旧python):

    如果您的dict是支持迭代的容器(列表、元组等)与不支持迭代(int、float)或不希望使用
    for
    循环(字符串、unicode、其他dict等)进行迭代的“单个项”的非同质组合,则会变得更具挑战性

    例如,假设您有一个列表和“单个项”的组合,它们是整数和字符串:

    import collections
    
    d={    'k1': [1,2,3],
           'k2': 2,
           'k3': [10],
           'k4': [3,2],
           'k5': 'string',
           'k6': ['string',2]
        }
    
    com_keys={}
    for k, v in d.items():
        if not isinstance(v, basestring) and isinstance(v, collections.Iterable):   
            for e in v:
                com_keys.setdefault(e, set()).add(k)    
        else:        
            com_keys.setdefault(v, set()).add(k)
    
    print com_keys
    # {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k6', 'k4']), 'string': set(['k6', 'k5'])}
    print {k:v for k,v in com_keys.items() if len(v)>1 }   
    # {2: set(['k2', 'k1', 'k6', 'k4']), 3: set(['k1', 'k4']), 'string': set(['k6', 'k5'])}
    

    您尝试的结果是什么?词典中的一个键怎么可能有多个值?或者您的字典值列表(元组、集合、任何容器)可能包含一个或多个值?您知道该键与哪个键具有相同的值是否很重要?这个问题似乎与主题无关,因为它属于on(他们希望看到代码的位置)我试图发布我的代码和输出,但编辑它们时遇到问题。我是否可以将它们作为文本文件上传?请评论。
    import collections
    
    d={    'k1': [1,2,3],
           'k2': 2,
           'k3': [10],
           'k4': [3,2],
           'k5': 'string',
           'k6': ['string',2]
        }
    
    com_keys={}
    for k, v in d.items():
        if not isinstance(v, basestring) and isinstance(v, collections.Iterable):   
            for e in v:
                com_keys.setdefault(e, set()).add(k)    
        else:        
            com_keys.setdefault(v, set()).add(k)
    
    print com_keys
    # {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k6', 'k4']), 'string': set(['k6', 'k5'])}
    print {k:v for k,v in com_keys.items() if len(v)>1 }   
    # {2: set(['k2', 'k1', 'k6', 'k4']), 3: set(['k1', 'k4']), 'string': set(['k6', 'k5'])}