質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1171閲覧

辞書の配列の辞書型の要素の重複を取り除きたい

k0908

総合スコア102

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/05/16 10:14

辞書の配列の辞書型の要素の重複を取り除きたい。

{'A':[{'a1':10,'a2':20},{'a1':10,'a2':20},{'a1':30,'a2':25}],'B':[{'a1':40,'a2':50},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':22,'a2':27},{'a1':22,'a2':27}],'C':[{'a1':10,'a2':20}]}

という辞書dfがある。

この辞書の配列の辞書型の要素の重複を取り除きたい。
例えば、{‘a1’:10,‘a2’:20},{‘a1’:10,‘a2’:20}は重複しているため1つにする、
{‘a1’:30,‘a2’:25},{‘a1’:30,‘a2’:25},{‘a1’:30,‘a2’:25}も重複しているため1つにするなど。
理想のアウトプットは、

{‘A’:[{‘a1’:10,‘a2’:20},{‘a1’:30,‘a2’:25}],’B’:[{‘a1’:40,‘a2’:50},{‘a1’:30,‘a2’:25},{‘a1’:22,‘a2’:27}],’C’:[{‘a1’:10,‘a2’:20}]}

のような形にすることである。

x=set(df) print(x)

とコードを書くと、
[‘A’,’B’,’C’] のようにキーだけの重複が取り除かれた。

要素は配列であるため、setメソッドでset(list)のようにして1行で書けるのか?
どのように書けば理想のアウトプットの辞書を出力できるか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/05/16 10:23

外側の辞書のAキーに属する辞書とCキーに属する辞書が重複する、といった場合は無視して構いませんか?
k0908

2018/05/16 10:24

はい、それは無視して大丈夫です
guest

回答2

0

ベストアンサー

効率を考えると微妙なアルゴリズムですが、とりあえず用は達します。

python

1from pprint import pprint 2 3dct = {'A':[{'a1':10,'a2':20},{'a1':10,'a2':20},{'a1':30,'a2':25}], 4 'B':[{'a1':40,'a2':50},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':22,'a2':27},{'a1':22,'a2':27}], 5 'C':[{'a1':10,'a2':20}]} 6 7def remove_duplicate(lst): 8 ret_lst = [] 9 for d in lst: 10 if d not in ret_lst: 11 ret_lst.append(d) 12 return ret_lst 13 14dct = {k:remove_duplicate(v) for k,v in dct.items()} 15pprint(dct) 16""" => 17{'A': [{'a1': 10, 'a2': 20}, {'a1': 30, 'a2': 25}], 18 'B': [{'a1': 40, 'a2': 50}, {'a1': 30, 'a2': 25}, {'a1': 22, 'a2': 27}], 19 'C': [{'a1': 10, 'a2': 20}]} 20"""

投稿2018/05/16 11:05

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

json.dumps()で文字列化(hashable)にしてsetに突っ込み、リスト時にjson.loads()で辞書に戻します。

Python

1d = {'A':[{'a1':10,'a2':20},{'a1':10,'a2':20},{'a1':30,'a2':25}],'B':[{'a1':40,'a2':50},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':30,'a2':25},{'a1':22,'a2':27},{'a1':22,'a2':27}],'C':[{'a1':10,'a2':20}]} 2print(d) 3 4import json 5for k,v in d.items(): 6import json 7for k,v in d.items(): 8 s = {json.dumps(i,sort_keys=True) for i in v} # set hayataka2049さんの指摘を受けsort_keysを追加 9 d[k] = [json.loads(i) for i in s] 10 11print(d)

投稿2018/05/16 11:20

編集2018/05/16 11:33
can110

総合スコア38267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/05/16 11:24 編集

sort_keys=Trueしておかないと怖い気がします ・・・dict.items()でtuple化して・・・とかも考えましたけど、どうやるのが速いんでしょうかこれ
can110

2018/05/16 11:35

あ~盲点でした。たしかに。ご指摘ありがとうございます。 jsonで文字列化は乱暴だし速度も?だけど、楽ちんなので(^^;
hayataka2049

2018/05/16 11:39

確かに「もしネストされたときは再帰的に・・・」とか考え始めると、強引に文字列にしてしまうjsonは良さげです
karamarimo

2018/05/16 14:32

こちらで実行しましたところ、↓のように出力され、list 内で順番が維持されていないです。 {'A': [{'a1': 10, 'a2': 20}, {'a1': 30, 'a2': 25}], 'B': [{'a1': 22, 'a2': 27}, {'a1': 40, 'a2': 50}, {'a1': 30, 'a2': 25}], 'C': [{'a1': 10, 'a2': 20}]} 質問者さんが順番を維持することを要求しているかはわからないですが、維持するには set ではなく OrderedDict を用いればできると思います。
can110

2018/05/17 09:17

> list 内で順番が維持されていない ですね~ 要求レベルによりますが、set→OrderdDictのほうが親切かもですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問