我想找到一种简单和/或快速的方法来查找
python中给出N个词典的所有常见对偶(对:值). (3.X会是最好的)
问题
给出一组3个dicts(但它可以是任何dict,它仅用于示例)
n1 = {'a': 1, 'b': 2, 'c': 3}
n2 = {'a': 1, 'b': 4, 'c': 3, 'd': 4}
n3 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
n1,n2和n3的公共(键:值)的结果
应该:
({'a': 1, 'c': 3})
对于n2和n3应该是
({'a': 1, 'c': 3, 'd': 4})
我首先考虑使用强力算法来检查每个字典的每一对(键:值)
这是使用递归算法的实现
解决方案A.
list_dict = [n1, n2, n3]
def finding_uniquness(ls):
def recursion(ls, result):
if not ls:
return result
result = {k: v for k, v in result.items() for k1, v1 in ls[0].items() if k == k1 and v == v1}
return recursion(ls[1:], result)
return recursion(ls[1:], ls[0])
finding_uniquness(list_dict)
# {'c': 3, 'a': 1}
但它不易理解,复杂性很高
(我不确定如何计算复杂度;但是因为我们比较了所有dict中的所有元素,复杂度应该是O(N²)?)
然后,我虽然约Sets.因为它可以自然地比较所有元素
解决方案B.
import functools
list_dict = [n1, n2, n3]
set_list = [set(n.items()) for n in list_dict]
functools.reduce(lambda x, y: x & y, set_list)
# {('a', 1), ('c', 3)}
它比以前的解决方案好得多,不幸的是,当其中一个键有一个列表作为值时会抛出一个错误:
>>> n = {'a': [], 'b': 2, 'c': 3}
>>> set(n.items())
TypeError: unhashable type: ‘list’
我的问题是双重的:
>有没有比解决方案A更好的算法?
>或者有没有办法避免使用SOLUTION B的TypeError?
当然,欢迎任何其他言论.