回答編集履歴

2

リストの構築方法を変更

2020/12/26 02:14

投稿

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

1

コードの修正

2020/12/26 02:14

投稿

退会済みユーザー
test CHANGED
@@ -32,9 +32,9 @@
32
32
 
33
33
 
34
34
 
35
- res = args[0]
35
+ res = dict()
36
36
 
37
- for d in args[1:]:
37
+ for d in args:
38
38
 
39
39
  for k, v in d.items():
40
40