【问题标题】:Finding the keys in a python dictionary for intersection of elements in the corresponding dictionary values在 python 字典中查找对应字典值中元素交集的键
【发布时间】:2016-11-26 08:28:29
【问题描述】:

我有以下 Python 字典:

{(a,b,c): [(1, 2, 3), (4, 5, 6)], (d,e,f):[(7,8,9)] ,(m, n, o): [(1, 2, 3), (7, 8, 9)]}

我正在尝试以以下格式查找与列表中元组元素的交集对应的键:
对于元组 (1,2,3),交集的输出应为:

(a,b,c), (m,n,o)

虽然可以将列表中的每个元组元素作为字典值进行迭代并找到相应的键,但我正在寻找一种 Python 方式来实现这一点。

【问题讨论】:

    标签: python list dictionary intersection


    【解决方案1】:
    >>> dic = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]}
    >>> [i for i in dic if (1,2,3) in dic[i]]
    [('a', 'b', 'c'), ('m', 'n', 'o')]
    >>> 
    

    如果不想迭代,可以使用filter

    >>> list(filter(lambda x:(1,2,3) in dic[x],dic))
    [('a', 'b', 'c'), ('m', 'n', 'o')]
    

    如果您喜欢模块,请使用itertools.takewhile

    >>> from itertools import takewhile
    >>> list(takewhile(lambda x:(1,2,3) in dic[x],dic))
    [('a', 'b', 'c'), ('m', 'n', 'o')]
    

    最后,如果不在内部/外部迭代集合,以上任何一个都不会做正确的事情。这个花哨的模块是一种包装器,在引擎盖下或多或少地做同样的事情。

    【讨论】:

    • "虽然可以将列表中的每个元组元素作为字典值进行迭代并找到相应的键,但我正在寻找一种 Python 的方法来实现这一点。"
    • @Arman,我不认为这不是 Python 的方式。对我来说,他根本不想要 for/while 循环,仅此而已。
    • 但是你遍历每个元组元素,但是 OP 要求不要这样做,我错了吗?
    • @Arman 和另一个反对者。由于您不喜欢上述解决方案,因此后一种解决方案适合您。虽然我仍然坚持我的观点,但后者是丑陋的,不那么蟒蛇。
    • 那一个班轮可能会更短:list(filter(lambda x: (1,2,3) in dic[x], dic))
    【解决方案2】:

    您的原始字典有语法错误,除非变量 a、b、c 等之前已定义。但这里有一个答案:

    [key for key in d if (1,2,3) in d[key]]
    

    【讨论】:

    • 这正是 OP 不想要的,因为他已经尝试过了。
    • @ssj.luffy 从原始帖子中不清楚究竟尝试了什么。这只是您对OP问题的解释。首先,任何列表搜索都需要迭代或递归,甚至是基于过滤器的。其次,我认为我提出的解决方案是最 Pythonic 的。
    【解决方案3】:

    可能 filter() 是选项之一:

    d = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]}
    
    def find_keys(my_dict, value):
        l = lambda x: value in my_dict[x]
        return list(filter(l, my_dict))
    
    result = find_keys(d, (1, 2, 3))
    

    【讨论】:

      【解决方案4】:

      如果你反转列表字典:

      d = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]}
      
      i = {}
      for k,v in d.items():
         for e in v:
           i.setdefault(e, []).append(k)
      

      i的内容:

      >>> i
      {(4, 5, 6): [('a', 'b', 'c')], (7, 8, 9): [('d', 'e', 'f'), ('m', 'n', 'o')], (1, 2, 3): [('a', 'b', 'c'), ('m', 'n', 'o')]}
      

      您可以像这样查询(1,2,3)

      >>> i[(1,2,3)]
      [('a', 'b', 'c'), ('m', 'n', 'o')]
      

      【讨论】:

      • 对于单个查询,您的解决方案有点过于戏剧化。但是,如果 OP 需要大量查找,它肯定会派上用场。它确实使用了两个 for 循环,这已被一些人抱怨(特别是在我的回答下)。然而,这是一个蹩脚的逻辑。总的来说,您的解决方案非常好。
      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多