質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1070閲覧

python 多次元リストにおける最大値の抽出

22Go

総合スコア55

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/06/01 10:14

編集2019/06/01 13:01

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コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

itertools.groupbyで。

Python

1import itertools 2import operator 3 4 5src = [ 6 ('a', 'b', '97.4'), ('a', 'c', '69.3'), ('a', 'd', '100'), ('a', 'f', '95.9'), ('a', 'p', '68.9'), 7 ('b', 'd', '64.7'), ('b', 'f', '191'), ('b', 'v', '213') 8] 9 10dst = [] 11for _, it in itertools.groupby(src, key=operator.itemgetter(0)): 12 m = max(it, key=lambda e: float(e[-1])) 13 dst.append(m) 14 15print(dst)

実行結果 Wandbox

[('a', 'd', '100'), ('b', 'v', '213')]

投稿2019/06/01 11:03

編集2019/06/01 11:11
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

0番目の要素ごとにまとめた後、抽出するといいと思われます。

pandasとかでも書けそうですが、標準の機能の範囲でやるなら下のような感じです。

python

1>>> lst = [('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')] 2>>> from collections import defaultdict 3>>> d = defaultdict(list) 4>>> for x in lst: 5... d[x[0]].append(x) 6... 7>>> result = [max(x, key=lambda x:float(x[2])) for x in d.values()] 8>>> result 9[('b', 'v', '213'), ('a', 'd', '100')]

投稿2019/06/01 10:27

編集2019/06/01 10:27
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

22Go

2019/06/01 10:32

ありがとうございます! defaultdictは知らなかったです。参考にさせていただきます!
22Go

2019/06/01 10:51

すみません、リストの中身がこのように ('N_4434.1', 'N_273.1', '12') なっているものを扱っていてエラーが出ました。 first argument must be callable or Noneと出たのですが、この場合どのように変更したらいいでしょうか?
hayataka2049

2019/06/01 10:59

そのデータは特に問題なさそうに思われます。エラーメッセージを全文示してください。
hayataka2049

2019/06/01 11:00

断定出来ませんが、listという変数名を使ってしまっているので、defaultdict(list)で失敗したような気がします。組み込み型・組み込み関数と被る変数名は避けるべきです。
22Go

2019/06/01 11:03

仰る通りでした。変更したらできました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問