質問編集履歴

2

重複した時にエラーが出現した

2019/06/01 13:01

投稿

22Go
22Go

スコア55

test CHANGED
File without changes
test CHANGED
@@ -25,3 +25,153 @@
25
25
 
26
26
 
27
27
  このように0番目の'a'の中で最も2番目の値が高いものをリスト化したいです。
28
+
29
+
30
+
31
+
32
+
33
+ 再びエラーが発生してしまったので、編集追記させていただきます。
34
+
35
+ ```python
36
+
37
+
38
+
39
+ list =
40
+
41
+ [('a', 'b', '100'), ('a', 'c', '69.3'), ('a', 'd', '100'), ('a', 'f', '95.9'), ('a', 'p', '68.9'), ('b', 'd', '64.7'), ('b', 'f', '191'), ('b', 'v', '213')]
42
+
43
+
44
+
45
+ >>> from collections import defaultdict
46
+
47
+ >>> d = defaultdict(list)
48
+
49
+ >>> for x in lst:
50
+
51
+ ... d[x[0]].append(x)
52
+
53
+ ...
54
+
55
+ >>> result = [max(x, key=lambda x:float(x[2])) for x in d.values()]
56
+
57
+ >>> result
58
+
59
+ [('a', 'b', '100'),('b', 'v', '213')]
60
+
61
+
62
+
63
+ ```
64
+
65
+
66
+
67
+ 大量のデータを扱っていましたら、このように
68
+
69
+ ```python
70
+
71
+ ('a', 'b', '100'), ('a', 'd', '100')
72
+
73
+ ```
74
+
75
+ ('a', 'b', '100')が優先でmax値として拾われたために('a', 'd', '100')のdを
76
+
77
+ スルーしてしました。。。
78
+
79
+
80
+
81
+ この場合はどのように抽出していったいいでしょうか?
82
+
83
+ 質問ばかりで申し訳ありません。宜しくお願い致します。
84
+
85
+
86
+
87
+ なぜ値が重複してしまったときにどちらも抽出したいかというと、
88
+
89
+ 2つのリストから共通するものを取り出したいためです。
90
+
91
+
92
+
93
+
94
+
95
+ ```python
96
+
97
+ from collections import defaultdict
98
+
99
+
100
+
101
+
102
+
103
+ hoge = [('a', 'b', '1'), ('a', 'c', '2'), ('a', 'd', '3'),('d', 'j', '10'),('d', 'k', '10'),
104
+
105
+ ('b', 'x', '1'), ('b', 'x', '2'), ('b', 'x', '3'), ('c', 'v', '1'), ('c', 'v', '2')]
106
+
107
+
108
+
109
+ hoge2 = [('b', 'a', '1'), ('c', 'a', '2'), ('d', 'a', '4'),
110
+
111
+ ('d', 'k', '5'),
112
+
113
+ ('mm', 'b', '1'), ('nn', 'b', '2'), ('x', 'b', '5'), ('kk', 'c', '6'), ('v', 'c', '3')]
114
+
115
+
116
+
117
+ print("最大値")
118
+
119
+ from collections import defaultdict
120
+
121
+ d = defaultdict(list)
122
+
123
+ for x in hoge:
124
+
125
+ d[x[0]].append(x)
126
+
127
+
128
+
129
+ result = [max(x, key=lambda x:float(x[2])) for x in d.values()]
130
+
131
+ print(result)
132
+
133
+
134
+
135
+ print("最大値")
136
+
137
+ a = defaultdict(list)
138
+
139
+ for x in hoge2:
140
+
141
+ a[x[0]].append(x)
142
+
143
+
144
+
145
+ result2 = [max(x, key=lambda x:float(x[2])) for x in a.values()]
146
+
147
+ print(result2)
148
+
149
+
150
+
151
+ print("最大値でdict作成")
152
+
153
+ hoge_dict = {(k1, k2):v for k1, k2, v in result}
154
+
155
+ hoge2_dict = {(k4, k3):v for k3, k4, v in result2}
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+ print("作ったdictから共通するものをだす")
164
+
165
+ ok = {k:hoge[k] for k in hoge_dict.keys() & hoge2_dict.keys()}
166
+
167
+
168
+
169
+ print(ok)
170
+
171
+
172
+
173
+
174
+
175
+ コード
176
+
177
+ ```

1

タイトルの変更

2019/06/01 13:01

投稿

22Go
22Go

スコア55

test CHANGED
@@ -1 +1 @@
1
- python dictkeyと値について
1
+ python 多次元リストにおける最大値抽出
test CHANGED
File without changes