62

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

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

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

TypeError: unhashable type: 'list'

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

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

ここで、TopPは上記の例のようなリストです。

このset()の使用法は間違っていますか?上記のリストを並べ替える他の方法はありますか?

4

4 に答える 4

55

セットでは、アイテムがハッシュ可能である必要があります。Pythonで事前定義された型のうち、文字列、数値、タプルなどの不変の型のみがハッシュ可能です。リストやdictなどの可変タイプは、内容を変更するとハッシュが変更され、ルックアップコードが破損するため、ハッシュできません。

とにかくリストを並べ替えているので、リストがすでに並べ替えられた後に重複する削除を配置するだけです。これは実装が簡単で、操作のアルゴリズムの複雑さを増すことはなく、サブリストをタプルに変更する必要はありません。

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)))
于 2012-11-19T23:21:56.497 に答える
18

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

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

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'
于 2012-11-19T23:20:41.330 に答える
2
    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)
于 2012-11-20T14:04:51.743 に答える
1

確かに理想的な解決策ではありませんが、リストをタプルに変換してから並べ替えると、理解しやすくなります。

mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
    thing = tuple(thing)
    mylist2.append(thing)
set(mylist2)
于 2016-07-15T03:30:38.613 に答える