繁体   English   中英

在python字典中查找键,以找到相应字典值中元素的交集

[英]Finding the keys in a python dictionary for intersection of elements in the corresponding dictionary values

我有以下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方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM