質問するログイン新規登録

回答編集履歴

2

リストの構築方法を変更

2020/12/26 02:14

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,54 @@
1
+ コメントを受けて、リストの構築方法を変更しました。
2
+ リストを結合する際、絶対に出てこない要素(ここではNone)をデリミタにして以下のような中間リストを作成します。[1, 9, None, 3, 6, 2, None, 3, 4, 7]
3
+ その後、update_list()でリストを組み立て直しています。
4
+
5
+ ```python
6
+ from itertools import zip_longest, chain
7
+
8
+ def solve(*args):
9
+ def my_update(k, v, base):
10
+ if k not in base or isinstance(v, int):
11
+ base[k] = v
12
+ elif isinstance(v, list):
13
+ base[k] += [None] + v
14
+ elif isinstance(v, dict):
15
+ for kk, vv in v.items():
16
+ my_update(kk, vv, base[k])
17
+ else:
18
+ raise TypeError # str型 や set型などの処理は未実装
19
+
20
+ def update_list(x):
21
+ if isinstance(x, list):
22
+ sp = [-1] + [i for i, e in enumerate(x) if e is None] + [len(x)]
23
+ res = [x[l+1:r] for l, r in zip(sp, sp[1:])]
24
+ x[:] = list(filter(lambda e: e is not None, chain.from_iterable(zip_longest(*res))))
25
+ elif hasattr(x, '__getitem__'):
26
+ for k, v in x.items():
27
+ update_list(v)
28
+
29
+ res = dict()
30
+ for d in args:
31
+ for k, v in d.items():
32
+ my_update(k, v, res)
33
+ update_list(res)
34
+ return res
35
+
36
+
37
+ A = {'apple': 1,
38
+ 'banana': {'cherry': 2, 'dekopon': [1, 9], 'egg': 4}}
39
+ B = {'banana': {'cherry': 1, 'dekopon': [3, 6, 2], 'feijoa': 5, 'foo': {'bar': {'baz': [1, 2]}}}}
40
+ C = {'apple': 5,
41
+ 'banana': {'dekopon': [3], 'foo': {'bar': {'baz': [3, 4]}}},
42
+ 'grape': 9}
43
+ D = {'banana': {'dekopon': [4, 7], 'feijoa': 6}}
44
+
45
+ ans = solve(A, B, C, D)
46
+ print(ans)
47
+ ```
48
+
49
+ ---
50
+ 以前の内容
51
+
1
52
  結合したい辞書のvalueデータ型に合わせて、一つずつ結合処理を書いていくしかないと思います。
2
53
  サンプルのデータであれば、たとえば以下のような実装でいけますが、実際のデータ型に合わせて調整が必要と思います。
3
54
 

1

コードの修正

2020/12/26 02:14

投稿

退会済みユーザー
answer CHANGED
@@ -15,8 +15,8 @@
15
15
  else:
16
16
  raise TypeError # str型 や set型などの処理は未実装
17
17
 
18
- res = args[0]
18
+ res = dict()
19
- for d in args[1:]:
19
+ for d in args:
20
20
  for k, v in d.items():
21
21
  my_update(k, v, res)
22
22
  return res