簡體   English   中英

TypeError: unhashable type: 'list' when using built-in set function

[英]TypeError: unhashable type: 'list' when using built-in set function

我有一個包含多個列表作為其元素的列表

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM