43908


unhashableのエラーがでます。  
listData2で同じ結果にする方法を教えて下さい。よろしくお願いします。

[code]

    #(参考)配列の重複した内容を削除する方法!!＞多次元配列
    #https://kiwamiden.com/how-to-delete-duplicate-contents-of-an-array
    listData1 = [(0, 1, 0), (0, 1, 0), (0, 0, 1), (0, 0, 1)]
    print(    list(set(listData1)))
    print(len(list(set(listData1))))
    # [(0, 1, 0), (0, 0, 1)]
    # 2
    listData2 = [[0, 1, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1]]
    #print(    list(set(listData2)))
    #print(len(list(set(listData2))))
    #TypeError: unhashable type: 'list'
    
[/code]


CC BY-SA 4.0
2018-05-10T14:07:34.330
43906
2018-05-10T15:11:45.467
17199
question
python
pythonの配列の[(),()]と[[],[]]の違いを教えて下さい。

[code]

    listData1 = [(0, 1, 0), (0, 1, 0), (0, 0, 1), (0, 0, 1)]
    
[/code]

これはタプルのリストです。

[code]

    listData2 = [[0, 1, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1]]
    
[/code]

これはリストのリストです。

リストは書き換え可能で、タプルは書き換え不可能です。

[code]

    listData1 = [(0, 1, 0), (0, 1, 0), (0, 0, 1), (0, 0, 1)]
    print(    list(set(listData1)))
    
[/code]

この場合、集合の要素はタプルです。

[code]

    listData2 = [[0, 1, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1]]
    print(    list(set(listData2)))
    
[/code]

この場合、リストを要素とする集合を作ろうとします。  
しかし、参考にしたページにあるように、また、

<https://docs.python.jp/3/library/stdtypes.html#set>

> 集合の要素は ハッシュ可能 なものでなくてはなりません。

<https://docs.python.jp/3/glossary.html#term-hashable>

> ミュータブルなコンテナ (例えばリストや辞書) はハッシュ不可能です。

ともあるように、リストは集合の要素にすることはできません。タプルならできます。

一旦、タプルに変換してしまいましょう。

[code]

    listData2 = [[0, 1, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1]]
    
    list_of_tuples = [ tuple(x) for x in listData2 ]    # タプルに変換
    unique_list = list(set(list_of_tuples))             # 一旦集合にしてリストに戻す
    list_of_list = [ list(x) for x in unique_list ]     # リストに戻す
    print(list_of_list)
    print(len(list_of_list))
    
[/code]


CC BY-SA 4.0
2018-05-10T15:11:45.467
43908
2018-05-10T15:11:45.467
5288
43906
answer