前提・実現したいこと
Pythonのリスト内辞書で重複を削除しようとしています。
キーが同じ時に削除と、キーも値も同じ時に削除する方法を探しています。
B = [{'a':['a', 'b', 'g']}, {'b':['a', 'b', 'g']}, {'b':['a', 'b', 'g']}, {{'b':['g', 'b', 'g']}] #キーも値も同じ時 B = [{'a':['a', 'b', 'g']}, {'b':['a', 'b', 'g']},{{'b':['g', 'b', 'g']}] #キーが同じ時 B = [{'a':['a', 'b', 'g']}, {'b':['a', 'b', 'g']}]
発生している問題・エラーメッセージ
普通のリストは、set()で重複を削除できるのですが、まずキーも値も同じ時にset()をリスト内辞書でも使用しようとしたところエラーになりました。
$ python sample.py ['b', 'g', 'a'] Traceback (most recent call last): File "sample.py", line 7, in <module> B = list(set(B)) TypeError: unhashable type: 'dict'
該当のソースコード
python
1A = ['a', 'a', 'b', 'g', 'a'] 2B = [{'a':['a', 'b', 'g']}, {'b':['a', 'b', 'g']}, {'b':['a', 'b', 'g']}] 3 4A = list(set(A)) 5print(A) 6 7B = list(set(B)) 8print(B)
試したこと
以下のように各要素にアクセスして、キーと値の一致を確認して削除することになるのでしょうか。
要素が増えるとアクセスしている配列Bの長さlen(B)がループを回すごとに変化していくので、より良い方法があれば教えていただきたいです。
[{'a': ['a', 'b', 'g']}, {'b': ['a', 'b', 'g']}]
for i in range(len(B)-1): if B[i].items() == B[i+1].items(): B.remove(B[i]) print(B)
tenjinさんの考える 同じ は何なのでしょうか。
以下のことを知らない人は結構多いので、ご自分でこれを確認してみてください。
>>> print( set([1, 1.0]))
{1}
これは、集合の要素して、1と1.0は 同じ であることを示しています。この結果、以下のことも成り立っています。
>>> print({1:'a'} == {1.0:'a'})
True
これを理解したうえで、tenjinさんの考える 同じ は何なのかを追記してください。
回答3件
あなたの回答
tips
プレビュー