TypeError:不可用类型:使用内置set函数时的'list'

ami*_*i91 35 python list duplicates

我有一个包含多个列表作为其元素的列表

eg: [[1,2,3,4],[4,5,6,7]]
Run Code Online (Sandbox Code Playgroud)

如果我使用内置的set函数从这个列表中删除重复项,我会收到错误

TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码是

TopP = sorted(set(TopP),reverse=True)
Run Code Online (Sandbox Code Playgroud)

其中TopP是一个列表,就像在例如Above

这个set()的用法是错误的吗?有没有其他方法可以对上面的列表进行排序?

use*_*342 37

套装要求其物品可以清洗.在Python预定义的类型中,只有不可变的类型(如字符串,数字和元组)是可清除的.可变类型(例如列表和dicts)不可清除,因为更改其内容会更改哈希并中断查找代码.

由于您仍在对列表进行排序,因此只需在列表已排序放置重复删除.这很容易实现,不会增加操作的算法复杂性,也不需要将子列表更改为元组:

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)))
Run Code Online (Sandbox Code Playgroud)


Nic*_*ell 11

设置删除重复的项目.为此,项目在集合中不能更改.列表可以在创建后更改,并称为"可变".你不能把可变的东西放在一个集合中.

列表具有不可变的等价物,称为"元组".这就是你如何编写一段代码列表,删除重复列表,然后反过来排序.

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'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!!在这里,结果是元组还是列表? (2认同)
  • @user1747696:转换回列表就像转换为元组一样简单:“结果=映射(列表,排序(设置(映射(元组,my_list)),反向= True))”。(在某些时候,您可能希望将其分成多行,并为中间步骤命名......) (2认同)