检查Python中两组`list type`或`set type`之间的相同性

时间:2014-03-12 02:33:43

标签: python list set

我有两组数据和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

如何检查它们是否由相同的元素组成?

4 个答案:

答案 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