python
1list = 2[('a', 'b', '97.4'), ('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')] 3
このようなリストがあるときに、0番目の文字をキープしたまま2番目の最大値を抽出したいときはどうしたらいいでしょうか?
理想は
python
1list_max = [('a', 'd', '100'),('b', 'v', '213')] 2
このように0番目の'a'の中で最も2番目の値が高いものをリスト化したいです。
再びエラーが発生してしまったので、編集追記させていただきます。
python
1 2list = 3[('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')] 4 5>>> from collections import defaultdict 6>>> d = defaultdict(list) 7>>> for x in lst: 8... d[x[0]].append(x) 9... 10>>> result = [max(x, key=lambda x:float(x[2])) for x in d.values()] 11>>> result 12[('a', 'b', '100'),('b', 'v', '213')] 13
大量のデータを扱っていましたら、このように
python
1('a', 'b', '100'), ('a', 'd', '100')
('a', 'b', '100')が優先でmax値として拾われたために('a', 'd', '100')のdを
スルーしてしました。。。
この場合はどのように抽出していったいいでしょうか?
質問ばかりで申し訳ありません。宜しくお願い致します。
なぜ値が重複してしまったときにどちらも抽出したいかというと、
2つのリストから共通するものを取り出したいためです。
python
1from collections import defaultdict 2 3 4hoge = [('a', 'b', '1'), ('a', 'c', '2'), ('a', 'd', '3'),('d', 'j', '10'),('d', 'k', '10'), 5 ('b', 'x', '1'), ('b', 'x', '2'), ('b', 'x', '3'), ('c', 'v', '1'), ('c', 'v', '2')] 6 7hoge2 = [('b', 'a', '1'), ('c', 'a', '2'), ('d', 'a', '4'), 8 ('d', 'k', '5'), 9 ('mm', 'b', '1'), ('nn', 'b', '2'), ('x', 'b', '5'), ('kk', 'c', '6'), ('v', 'c', '3')] 10 11print("最大値") 12from collections import defaultdict 13d = defaultdict(list) 14for x in hoge: 15 d[x[0]].append(x) 16 17result = [max(x, key=lambda x:float(x[2])) for x in d.values()] 18print(result) 19 20print("最大値") 21a = defaultdict(list) 22for x in hoge2: 23 a[x[0]].append(x) 24 25result2 = [max(x, key=lambda x:float(x[2])) for x in a.values()] 26print(result2) 27 28print("最大値でdict作成") 29hoge_dict = {(k1, k2):v for k1, k2, v in result} 30hoge2_dict = {(k4, k3):v for k3, k4, v in result2} 31 32 33 34print("作ったdictから共通するものをだす") 35ok = {k:hoge[k] for k in hoge_dict.keys() & hoge2_dict.keys()} 36 37print(ok) 38 39 40コード
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。