実現したいこと
変更前データを変更後データのようにリスト形式に書き直したい
変更前データ
data =[ { "id": 1, "fruits": "apple", "cd": 1, "cd_val": "Hokkaido", }, { "id": 1, "fruits": "apple", "cd": 2, "cd_val": "Aomori" }, { "id": 1, "fruits": "apple", "cd": 4, "cd_val": "Iwate", }, { "id": 2, "fruits": "banana", "cd": 5, "cd_val": "Yamagata", }, { "id": 3, "fruits": "grape", "cd": 3, "cd_val": "Akita", }, { "id": 3, "fruits": "grape", "cd": 6, "cd_val": "Miyagi", }, { "id": 3, "fruits": "grape", "cd": 7, "cd_val": "Niigata", }, ]
変更後データ
result =[ { "id": 1, "fruits": "apple", "cd": [1,2,4], "cd_val": ["Hokkaido","Aomori","Iwate"] }, { "id": 2, "fruits": "banana", "cd": [5], "cd_val": ["Yamagata"] }, { "id": 3, "fruits": "grape", "cd": [3,6,7], "cd_val": ["Akita","Miyagi","Niigata"] } ]
試したこと
試したコード①
from pprint import pprint from itertools import groupby result = [ {'id': k[0], 'fruits': k[1], 'cd': [e['cd'] for e in group], 'cd_val': [e['cd_val'] for e in group]} for k, group in groupby(data, lambda e: (e['id'], e['fruits'])) ] pprint(result, sort_dicts=False)
コード①の出力結果
[{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 4], 'cd_val': []}, {'id': 2, 'fruits': 'banana', 'cd': [5], 'cd_val': []}, {'id': 3, 'fruits': 'grape', 'cd': [3, 6, 7], 'cd_val': []}]
cd_val が 空のリストになってしまい、修正方法がわかりませんでした。
試したコード②
from pprint import pprint from itertools import groupby keyfunc = lambda x: x['id'] result = [] [result.append( {'id': k, 'fruits': list(group)[0]['fruits'], 'cd': [i['cd'] for i in list(group)], 'cd_val': [i['cd_val'] for i in list(group)]}) for k, group in groupby(sorted(data, key=keyfunc), keyfunc) ] pprint(result, sort_dicts=False)
コード②の出力結果
[{'id': 1, 'fruits': 'apple', 'cd': [], 'cd_val': []}, {'id': 2, 'fruits': 'banana', 'cd': [], 'cd_val': []}, {'id': 3, 'fruits': 'grape', 'cd': [], 'cd_val': []}]
cd と cd_val が空のリストになってしまい、修正方法がわかりませんでした。
試したコード③
from pprint import pprint from itertools import groupby keyfunc = lambda x: x['id'] result = [ {'id': k, 'fruits': list(group)[0]['fruits'], 'cd': [item['cd'] for item in list(group)], 'cd_val': [item['cd_val'] for item in list(group)]} for k, group in groupby(sorted(data, key=keyfunc), keyfunc) ] pprint(result, sort_dicts=False)
コード③の出力結果
[{'id': 1, 'fruits': 'apple', 'cd': [], 'cd_val': []}, {'id': 2, 'fruits': 'banana', 'cd': [], 'cd_val': []}, {'id': 3, 'fruits': 'grape', 'cd': [], 'cd_val': []}]
cd と cd_val が空のリストになってしまい、修正方法がわかりませんでした。
keyfunc = lambda x: x['id'] にして、リスト内包表記で書きたいと思っているのですが、コード③の修正方法がわからず、修正方法を教えていただきたいです。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/02/05 13:21
2023/02/05 23:03
2023/02/06 03:46