我有一个包含多个列表作为其元素的列表
eg: [[1,2,3,4],[4,5,6,7]]
如果我使用内置的 set 函数从此列表中删除重复项,则会收到错误消息
TypeError: unhashable type: 'list'
我正在使用的代码是
TopP = sorted(set(TopP),reverse=True)
其中 TopP 是一个列表,就像上面的例子一样
set() 的这种用法是错误的吗?还有其他方法可以对上述列表进行排序吗?
我有一个包含多个列表作为其元素的列表
eg: [[1,2,3,4],[4,5,6,7]]
如果我使用内置的 set 函数从此列表中删除重复项,则会收到错误消息
TypeError: unhashable type: 'list'
我正在使用的代码是
TopP = sorted(set(TopP),reverse=True)
其中 TopP 是一个列表,就像上面的例子一样
set() 的这种用法是错误的吗?还有其他方法可以对上述列表进行排序吗?
集合要求它们的项目是可散列的。在 Python 预定义的类型中,只有不可变的类型(例如字符串、数字和元组)是可散列的。可变类型(例如列表和字典)不可散列,因为更改其内容会更改散列并破坏查找代码。
由于您无论如何都要对列表进行排序,因此只需在列表已排序后放置重复删除。这很容易实现,不会增加操作的算法复杂度,并且不需要将子列表更改为元组:
def uniq(lst):
last = object()
for item in lst:
if item == last:
continue
yield item
last = item
def sort_and_deduplicate(l):
return list(uniq(sorted(l, reverse=True)))
集删除重复项。为了做到这一点,该项目在集合中时不能更改。列表在创建后可以更改,并且被称为“可变”。你不能把可变的东西放在一个集合中。
列表有一个不可变的等价物,称为“元组”。这就是您编写一段代码的方式,该代码获取列表列表,删除重复列表,然后将其反向排序。
result = sorted(set(map(tuple, my_list)), reverse=True)
附加说明:如果一个元组包含一个列表,该元组仍然被认为是可变的。
一些例子:
>>> hash( tuple() )
3527539
>>> hash( dict() )
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
hash( dict() )
TypeError: unhashable type: 'dict'
>>> hash( list() )
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
hash( list() )
TypeError: unhashable type: 'list'
python 3.2
>>>> from itertools import chain
>>>> eg=sorted(list(set(list(chain(*eg)))), reverse=True)
[7, 6, 5, 4, 3, 2, 1]
##### eg contain 2 list within a list. so if you want to use set() function
you should flatten the list like [1, 2, 3, 4, 4, 5, 6, 7]
>>> res= list(chain(*eg)) # [1, 2, 3, 4, 4, 5, 6, 7]
>>> res1= set(res) # [1, 2, 3, 4, 5, 6, 7]
>>> res1= sorted(res1,reverse=True)
绝对不是理想的解决方案,但是如果我将列表转换为元组然后对其进行排序,我会更容易理解。
mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
thing = tuple(thing)
mylist2.append(thing)
set(mylist2)