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

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

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

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

Q&A

解決済

1回答

676閲覧

PythonのDictの同じIDを持つアイテムの統合

etsuji112

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/06/19 07:29

前提・実現したいこと

Pythonで辞書の中の同じIDを持つアイテムを統合する方法について教えて下さい。
具体的な仕様としては、指定したキーの値が同じ(複数の/単独の)アイテムを一つのアイテムに統合するというもので、キー毎に値が同じものは追加せず、値が違うものは配列として両方を記録するというものを想定しています。

入力データ

{'ID': 'A1', 'name': 'abc', 'url': 'https://example.com/123'}, {'ID': 'A2', 'name': 'def', 'url': 'https://example.com/456'}, {'ID': 'A3', 'name': 'ghi', 'url': 'https://example.com/789'}, {'ID': 'A1', 'name': 'ab and c', 'url': 'https://example.com/123'}, {'ID': 'A2', 'name': 'def', 'url': 'https://other-example.com/456'},

変換後のデータ

{'ID': 'A1', 'name':['abc', 'ab and c'], 'url': 'https://example.com/123'}, {'ID': 'A2', 'name': 'def', 'url': ['https://example.com/123', 'https://other-example.com/456']}, {'ID': 'A3', 'name': 'ghi', 'url': 'https://example.com/789'},

試したこと

itertoolsのgroupbyなどで値の更新(上書き)などはできたのですが、配列化がうまくいきませんでした。
ご教示のほど、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通にやるとこうなります。
他にあまり良い方法も思いつきません。

入力データ

python

1dicts = [{'ID': 'A1', 'name': 'abc', 'url': 'https://example.com/123'}, 2{'ID': 'A2', 'name': 'def', 'url': 'https://example.com/456'}, 3{'ID': 'A3', 'name': 'ghi', 'url': 'https://example.com/789'}, 4{'ID': 'A1', 'name': 'ab and c', 'url': 'https://example.com/123'}, 5{'ID': 'A2', 'name': 'def', 'url': 'https://other-example.com/456'}]

変換コード

python

1def collect(dlist, key): 2 values = list({d[key] for d in dlist if key in d}) 3 if len(values) == 1: 4 return values[0] 5 else: 6 return values 7 8def unite(dlist, keys): 9 return {key : collect(dlist, key) for key in keys} 10 11def make_dict_list(dicts, IDs, keys): 12 return [unite([d for d in dicts if d['ID'] == ID], keys) for ID in IDs] 13 14keys = set(sum([list(d.keys()) for d in dicts], [])) 15IDs = {d['ID'] for d in dicts} 16 17results = make_dict_list(dicts, IDs, keys)

実行結果

python

1>>> results = make_dict_list(dicts, IDs, keys) 2>>> 3>>> for r in results: 4... print(r) 5... 6{'name': ['ab and c', 'abc'], 'url': 'https://example.com/123', 'ID': 'A1'} 7{'name': 'def', 'url': ['https://example.com/456', 'https://other-example.com/456'], 'ID': 'A2'} 8{'name': 'ghi', 'url': 'https://example.com/789', 'ID': 'A3'} 9

投稿2021/06/19 08:33

ppaul

総合スコア24666

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

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

etsuji112

2021/06/19 08:47

ありがとうございました、とても勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問