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

时间:2012-11-19 23:19:01

标签: python list duplicates

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

eg: [[1,2,3,4],[4,5,6,7]]

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

TypeError: unhashable type: 'list'

我正在使用的代码是

TopP = sorted(set(TopP),reverse=True)

TopP是一个列表,就像在例如上述

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

4 个答案:

答案 0 :(得分:36)

设置要求他们的项目 hashable 。在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)))

答案 1 :(得分:10)

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

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

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'

答案 2 :(得分:1)

    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)

答案 3 :(得分:0)

绝对不是理想的解决方案,但如果我将列表转换为元组然后对其进行排序,我就会更容易理解。

mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
    thing = tuple(thing)
    mylist2.append(thing)
set(mylist2)