回答編集履歴

3

修正

2019/02/21 07:49

投稿

can110
can110

スコア38268

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  -----
4
4
 
5
- 提示コードは確認していませんが、以下のような結果を得たいということでしょうか。
5
+ **提示コードは実行できない**ため確認していませんが、以下のような結果を得たいということでしょうか。
6
6
 
7
7
  ```Python
8
8
 

2

回答修正

2019/02/21 07:49

投稿

can110
can110

スコア38268

test CHANGED
@@ -2,13 +2,111 @@
2
2
 
3
3
  -----
4
4
 
5
- 何か違うような気がしまが、とりあえず回答として残しておきます
5
+ 提示コードは確認ていせんが、以下のような結果を得たいいうこょうか
6
+
7
+ ```Python
8
+
9
+ # 出現する値を(昇順に)取得したリストを返す
10
+
11
+ def get_values(dlst):
12
+
13
+ values = set()
14
+
15
+ for d in dlst:
16
+
17
+ for v in d.values():
18
+
19
+ values |= set(v)
20
+
21
+ return sorted(list(values))
6
22
 
7
23
 
8
24
 
25
+
26
+
27
+ # キーと値を逆にした辞書のリストを返す
28
+
29
+ def get_reveased_kv(dlst):
30
+
31
+ revs = []
32
+
33
+ for d in dlst:
34
+
35
+ rev = {}
36
+
37
+ for key,lst in d.items():
38
+
39
+ for v in lst:
40
+
41
+ if not v in rev:
42
+
43
+ rev[v] = []
44
+
45
+ rev[v].append(key)
46
+
47
+ revs.append(rev)
48
+
49
+ return revs
50
+
51
+
52
+
53
+
54
+
55
+ d1 = {'A':[0,1,2]}
56
+
57
+ d2 = {'C':[0,2,3],'D':[1,2]}
58
+
59
+ d3 = {'E':[2,3],'F':[0],'G':[1]}
60
+
61
+
62
+
63
+ dlst = [d1,d2,d3]
64
+
65
+
66
+
67
+ values = get_values(dlst)
68
+
69
+ print(values) # [0, 1, 2, 3]
70
+
71
+
72
+
73
+ revs = get_reveased_kv(dlst)
74
+
75
+ print(revs)# [{0: ['A'], 1: ['A'], 2: ['A']}, {0: ['C'], 2: ['C', 'D'], 3: ['C'], 1: ['D']}, {2: ['E'], 3: ['E'], 0: ['F'], 1: ['G']}]
76
+
77
+
78
+
79
+ import itertools
80
+
81
+ ret = []
82
+
83
+ for val in values: # 値毎に
84
+
85
+ lsts = []
86
+
87
+ for d in revs: # 各辞書から値を含むキー(リスト)を取得
88
+
89
+ if val in d:
90
+
91
+ lsts.append(d[val])
92
+
93
+ if len(lsts) == len(revs): # すべての辞書からキーが見つかった
94
+
95
+ for p in itertools.product(*lsts): # 全組み合わせ(直積)を列挙
96
+
97
+ ret.append(p)
98
+
99
+
100
+
101
+ print(ret) # [('A', 'C', 'F'), ('A', 'D', 'G'), ('A', 'C', 'E'), ('A', 'D', 'E')]
102
+
103
+ ```
104
+
105
+
106
+
107
+ 以前の回答
108
+
9
109
  -----
10
-
11
- 提示コードは確認していませんが、以下のような結果を得たいということでしょうか。
12
110
 
13
111
  ```Python
14
112
 

1

追記

2019/02/21 07:46

投稿

can110
can110

スコア38268

test CHANGED
@@ -1,3 +1,13 @@
1
+ 追記
2
+
3
+ -----
4
+
5
+ 何か違うような気がしますが、とりあえず回答として残しておきます。
6
+
7
+
8
+
9
+ -----
10
+
1
11
  提示コードは確認していませんが、以下のような結果を得たいということでしょうか。
2
12
 
3
13
  ```Python