web-dev-qa-db-ja.com

TypeError:ハッシュできない型:組み込みのset関数を使用する場合の 'list'

要素として複数のリストを含むリストがあります

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

組み込み関数setを使用してこのリストから重複を削除すると、エラーが発生します

TypeError: unhashable type: 'list'

私が使用しているコードは

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

TopPは、たとえば上

Set()のこの使用法は間違っていますか?上記のリストをソートできる他の方法はありますか?

35
ami91

セットでは、項目がhashableである必要があります。 Pythonによって事前定義された型のうち、文字列、数字、タプルなどの不変のものだけがハッシュ可能です。リストや辞書などの可変タイプは、内容が変更されるためハッシュできませんハッシュが変更され、ルックアップコードが破損します。

とにかくリストをソートしているので、重複削除を配置するだけですafterリストはすでにソートされています。これは実装が簡単で、操作のアルゴリズムの複雑さを増加させず、サブリストをタプルに変更する必要がありません。

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)))
37
user4815162342

重複アイテムを削除するセット。そのためには、セットにいる間はアイテムを変更できません。リストは作成後に変更でき、「可変」と呼ばれます。可変のものをセットに入れることはできません。

リストには、「タプル」と呼ばれる不変の同等物があります。これは、リストのリストを取得し、重複するリストを削除し、逆順にソートするコードを書く方法です。

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'
11
Nick ODell
    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)
1
raton

間違いなく理想的なソリューションではありませんが、リストをタプルに変換してから並べ替えると、理解しやすくなります。

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