消除重复列表?

时间:2017-07-11 18:40:16

标签: python python-3.x

我有一个应该包含一堆唯一列表项的集合: 这就是我试图定义它的方式。

results = set([], key= self.comparator)

这是比较器功能,

def comparator(self, l1, l2):
    if len(l1) != len(l2):
        return -1
    i = 0
    while i < len(l1):
        if l1[i] != l2[i]:
            return -1
        i += 1
    return 0

这会引发以下错误,

TypeError: set() does not take keyword arguments

显然,set构造函数不接受密钥, 如果我没有传递密钥,那么我会收到以下错误,

TypeError: unhashable type: 'list'

因此,我试图消除重复列表的方式不起作用。我怎么能用Python做呢。

2 个答案:

答案 0 :(得分:2)

您可以将列表转换为元组以执行您想要的操作:

my_lists = [[1,2,3], [1,2], [1,2,3]]
tuples = [tuple(l) for l in my_lists]

print(set(tuples))

似乎可以实现您的需求。

打印:

set([(1, 2), (1, 2, 3)])

答案 1 :(得分:2)

就像你想的那样,set不接受这样的密钥。然而,无论你把它作为物品带来什么,它都是&#34; hashable&#34;,这实际上意味着它有一个__hash__()方法。 list没有工作哈希,正如您在此示例中所看到的那样:

a = 'a'
a.__hash__() # prints -8546348471933684759
a = [1,2,3]
a.__hash__() # will throw TypeError

如果您要定义一个类似于列表但具有基于其值的唯一哈希值的新类,则可以在其上使用set

class mylist(list):
    def __hash__(self):
        return sum(item.__hash__() for item in self)

a = mylist([1,2,3])
b = mylist([1,2,3])
c = mylist([4,5,6])
unique_lists = set((a,b,c))
print(unique_lists) # prints {[1, 2, 3], [4, 5, 6]}