在python字典中查找对应字典值中元素相交的键

在python字典中查找对应字典值中元素相交的键,python,list,dictionary,intersection,Python,List,Dictionary,Intersection,我有以下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) 虽然可以将列表中的每个元组元素作为字典值进行迭代,并找到相应的键,但我正在寻找一种pythonic方法来实现这一点 >>> dic = {('a

我有以下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)
虽然可以将列表中的每个元组元素作为字典值进行迭代,并找到相应的键,但我正在寻找一种pythonic方法来实现这一点

>>> 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')]

最后,如果不对集合进行内部/外部迭代,以上任何一项都无法正确完成。这种奇特的模块是一种包装,在引擎盖下做或多或少相同的事情

除非先前定义了变量a、b、c等,否则原始词典存在语法错误。但这里有一个答案:

[key for key in d if (1,2,3) in d[key]]
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))

如果颠倒列表字典:

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')]

“虽然可以迭代列表中的每个元组元素作为字典值并找到相应的键,但我正在寻找一种pythonic方法来实现这一点。”@Arman,我不认为这不是pythonic方法。对我来说,他只是不想要一个for/while循环,就是这样。但是你迭代每个元组元素,但是OP要求不要这样做,我错了吗?@Arman和另一个downvoter。由于您不喜欢上面的解决方案,后面的解决方案适合您。虽然我仍然坚持我的观点,但后一个是丑陋的,不太像python。那一行可以更短:
list(filter(lambda x:(1,2,3)在dic[x],dic))
这正是OP不想要的,因为他已经尝试过了。@ssj.luffy从最初的帖子中不清楚到底尝试了什么。这只是你对OP问题的解释。首先,任何列表搜索都需要迭代或递归,甚至基于过滤器。第二,我相信我提出的解决方案是最具python风格的。对于单个查询,您的解决方案有点过于戏剧化。但是,如果OP需要大量的查找,它肯定很方便。它确实使用了两个for循环,这已经被一些人抱怨过了(特别是在我的回答下)。然而,这是一个蹩脚的逻辑。总的来说,你的解决方案很好。