我有两组数据和list元素列表。
例如:
set1 : [[1,2,3], [2,3,4], [1,2]]
set2 : [[1,2], [1,2,3], [2,3,4]]
我尝试使用set of list或set set来使用set' s ==运算符,但我有TypeError: unhashable type: 'list'
错误。
x = set([[1,2,3],[2,3,4],[1,2]]) <-- Error raised
y = set([[1,2],[1,2,3],[2,3,4]])
x == y
如何检查它们是否由相同的元素组成?
答案 0 :(得分:3)
Python的列表是一种不可用的类型,你可以创建它们的元组:
>>> l1 = [[1,2,3], [2,3,4], [1,2]]
>>> l2 = [[1,2], [1,2,3], [2,3,4]]
>>> set(map(tuple, l1))
set([(1, 2), (2, 3, 4), (1, 2, 3)])
>>> set(map(tuple, l2))
set([(1, 2), (2, 3, 4), (1, 2, 3)])
>>> set(map(tuple, l1)) == set(map(tuple, l2))
True
答案 1 :(得分:1)
诀窍就是为内部集合使用hashable类型。 frozenset
完全适合该法案。
> set1 = [[1,2,3], [4,3,2], [1,2]]
> set2 = [[1,2], [1,2,3], [2,3,4]]
> def nested_set_equality(s1, s2):
s1 = set(frozenset(e) for e in s1)
s2 = set(frozenset(e) for e in s2)
return s1 == s2
> nested_set_equality(set1, set2)
True
如果订单对内部元素很重要(例如[1,2,3]
),则tuple
是适当的类型,而不是frozenset
。如果订单很重要且倍数很重要([[1,2],[1,2]]
),我们可以使这更简单:
> sorted(set1) == sorted(set2)
答案 2 :(得分:0)
我假设您正在尝试压缩列表并从中制作一套。
set1 = set([el for sublist in lst1 for el in sublist])
set2 = set([el for sublist in lst2 for el in sublist])
set1 == set2
# True
您还可以定义递归函数来展平列表:
def flatten(lst):
out = list()
for el in lst:
if hasattr(el,"__iter__"):
yield from flatten(el)
else:
yield el
set(flatten(lst1)) == set(flatten(lst2))
这将处理任何可迭代的n级深度迭代。
答案 3 :(得分:0)
#remove duplicate, arrange and convert to string. ie. [1,2] to '1,2'
def conv(l):
d=list(set(l)) #remove duplicate
d.sort() #arrange
return str(d)[1:-1] # convert to string ie. [1,2] to '1,2'
#now you can use that:ie
s1=[1,2,3],[2,3,4],[1,2]
s2=[1,2], [1,2,3], [2,3,4]
x = set([conv(i) for i in s1]) # <-- No Error raised.. :)
y = set([conv(i) for i in s2])
x == y