我想找到一种简单和/或快速的方法来查找给定python字典的所有公共对(pair:value)。(3.X最好)
问题
给定一组3dicts(但它可以是任何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的公共(key:values)结果
应该是:
^{pr2}$
对于n2和n3,它应该是({'a': 1, 'c': 3, 'd': 4})
我首先考虑使用一个暴力算法,它将检查每个dict的每一对(key:value)
下面是一个使用递归算法的实现
解决方案Alist_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²)在
然后,我想了想^{}。因为它可以自然地比较所有元素
解决方案Bimport 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)}
不幸的是,当key中的一个具有list作为值时,它将抛出一个错误:>>> n = {'a': [], 'b': 2, 'c': 3}
>>> set(n.items())TypeError: unhashable type: 'list'
我的问题是双重的:有没有比解A更好的算法呢?在
或者,有没有办法用溶液B来避免{}?在
当然,还有其他的欢迎词。在