リスト型のデータを以下のように変更したいと思っています。
変更前データ
[ { "id": 1, "fruits": "apple", "cd": 1 }, { "id": 1, "fruits": "apple", "cd": 2 }, { "id": 1, "fruits": "apple", "cd": 4 }, { "id": 2, "fruits": "banana", "cd": 5 }, { "id": 3, "fruits": "grape", "cd": 3 }, { "id": 3, "fruits": "grape", "cd": 6 }, { "id": 3, "fruits": "grape", "cd": 7 }, ]
変更後イメージ
[ { "id": 1, "fruits": "apple", "cd": [1,2,4] }, { "id": 2, "fruits": "banana", "cd": [5] }, { "id": 3, "fruits": "grape", "cd": [3,6,7] } ]
以下のコードを作成し、実行しました。
list = [ { "id": 1, "fruits": "apple", "cd": 1 }, { "id": 1, "fruits": "apple", "cd": 2 }, { "id": 1, "fruits": "apple", "cd": 4 }, { "id": 2, "fruits": "banana", "cd": 5 }, { "id": 3, "fruits": "grape", "cd": 3 }, { "id": 3, "fruits": "grape", "cd": 6 }, { "id": 3, "fruits": "grape", "cd": 7 }, ] id_1 = 0 # 初期値 j = 0 # 初期値 e = [] for item in list: id_2 = item["id"] if id_1 == id_2: cd_1.append(item["cd"]) item["cd"] = cd_1 e.append(j - 1) else: id_1 = item["id"] item["cd"] = [item["cd"]] cd_1 = item["cd"] j += 1 j = 0 # 初期値 k = 0 # 初期値 for _ in e: del list[e[j] - k] j += 1 k += 1
実行結果
>>> list [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 4]}, {'id': 2, 'fruits': 'banana', 'cd': [5]}, {'id': 3, 'fruits': 'grape', 'cd': [3, 6, 7]}]
【コードの流れ】
- 変数 list にデータを格納する。
- 変数 id_1 の初期値を 0 にする。
- リスト型の変数 e を用意する。
- list の各データに対して、id の値と id_1 の値を比較する。
4-1. id の値と id_1 の値が異なるならば(if文のelseの処理)1つ目のデータと判断し、id_1 の値を更新する。cd の値をリスト型に変更する。cd_1 というリスト型の変数に cd の値を代入する。
4-2. id の値と id_1 の値値が同じならば、2つ目以降のデータと判断する。cd_1 に cd の値を append する。cd_1 の変数を更新する。リストe にひとつ前のリスト番号を格納する。
5. リストeには不要なデータのリスト番号が格納されている。変数listに対して、不要なデータの削除を実行する。
可読性が低いコードになっています。より良く書けるコードがあれば教えていただきたいです。
▽追記
みなさま回答ありがとうございました。自分の実力ではどれをベストアンサーにすればよいかわからないので、1ヵ月ほど様子を見て「グッド」の数が多い回答をベストアンサーにして質問を閉めさせていただきます。ありがとうございました。
回答4件
あなたの回答
tips
プレビュー