我有一个应该包含一堆唯一列表项的集合: 这就是我试图定义它的方式。
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做呢。
答案 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]}