要素として複数のリストを含むリストがあります
eg: [[1,2,3,4],[4,5,6,7]]
組み込み関数setを使用してこのリストから重複を削除すると、エラーが発生します
TypeError: unhashable type: 'list'
私が使用しているコードは
TopP = sorted(set(TopP),reverse=True)
TopPは、たとえば上
Set()のこの使用法は間違っていますか?上記のリストをソートできる他の方法はありますか?
セットでは、項目が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)))
重複アイテムを削除するセット。そのためには、セットにいる間はアイテムを変更できません。リストは作成後に変更でき、「可変」と呼ばれます。可変のものをセットに入れることはできません。
リストには、「タプル」と呼ばれる不変の同等物があります。これは、リストのリストを取得し、重複するリストを削除し、逆順にソートするコードを書く方法です。
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)