我想得到两个具有以下结构的列表的区别:
first_dict = [{"a": "abcd","b":"defg", "c":["fng","xvg"]}, {"a": "stg","b":"klsm", "c":["xzy"]}]
second_dict = [{"a": "abcd","b":"defg", "c":["fng","xvg"]}]
我试着把布景冻结如下:
i_set = { frozenset(row.items()) for row in first_dict }
a_set = { frozenset(row.items()) for row in second_dict }
result = [dict(i) for i in i_set - a_set]
预期结果:
v = {"a": "stg","b":"klsm", "c":["xzy"]}
因为"c":[]
是一个列表,我得到以下错误:
TypeError: unhashable type: 'list'
既然您使用了
set
和frozenset
,我假设您关心效率而不需要O(n**2)
算法。你知道吗在这种情况下,您不仅需要将字典转换为冻结集,还需要将列表转换为可哈希类。你可以用
tuple
s假设您的输入:
您可以使用:
结果是:
然而,这不会区分元组中的元组和元组列表中的元组。你知道吗
您可以通过将字典包装到自己的hashable类中来解决这个问题(如果您确定字典及其内容在操作过程中没有发生变化)。这样做的好处是,以后不需要将它们转换回来,只需“展开”值即可。你知道吗
结果将是:
尽管您也可以避免整个转换/包装并采用
O(n**2)
方法:这也给出了预期的结果:
为什么
frozenset
?,只需使用:或者如果你想要一个单数,改变:
收件人:
输出:
相关问题 更多 >
编程相关推荐