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

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

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

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

Q&A

解決済

1回答

1341閲覧

python dictとlistの複雑なペアから最大値を取り出す

22Go

総合スコア55

Python

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

0グッド

0クリップ

投稿2019/06/07 22:07

編集2019/06/07 22:08

前回の質問は解決したのですが、新たにオプションをつけたく
質問させていただきます。

前回の質問

python

1import itertools 2import operator 3 4 5src = [('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')] 6dst = [] 7for _, it in itertools.groupby(src, key=operator.itemgetter(0)): 8 m = max(it, key=lambda e: float(e[-1])) 9 dst.append(m) 10 11print(dst) 12

python

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

どちらのコードでも同じ結果が返ってきました。
非常に助かりました。ありがとうございます。

python

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

しかし、データを解析しているとこのように

python

1 2 new_list = [('a', 'b', '100'),('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')] 3

('a', 'b', '100'),('a', 'd', '100')といった同じaを持つ最大値のペアが出てきてしまいました。
この場合、抽出されるのは('a', 'b', '100')のみです。
これを('a', 'b', '100'),('a', 'd', '100')のどちらも抽出したく、質問させていただきます。

宜しくお願い致します。****

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

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

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

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

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

guest

回答1

0

ベストアンサー

最大値を決定後、最大値に一致する要素を抽出してはどうでしょうか。

Python

1import itertools 2import operator 3 4src = [('a', 'b', '100'),('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')] 5#src = set(src) # ('a', 'b', '100')の重複を除外したい場合はこれを生かす 6 7max_values = dict() 8for _, it in itertools.groupby(src, key=operator.itemgetter(0)): 9 m = max(it, key=lambda e: float(e[-1])) 10 max_values[m[0]] = m[2] 11 12# 最大値を持つ要素を抽出 13dst = [e for e in src if e[2] == max_values[e[0]] ] 14 15print(dst) # [('a', 'b', '100'), ('a', 'b', '100'), ('a', 'd', '100'), ('b', 'v', '213')]

投稿2019/06/07 22:45

can110

総合スコア38233

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

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

22Go

2019/06/08 01:51

ありがとうございます。 for _, it というのは0番目と1番目の文字のことでしょうか? いくつか解説となるページを見たのですが、いまいち理解できなくて、、、
can110

2019/06/08 02:31

コード前半は前回質問の回答をそのまま拝借したものです。 _はaなどの集約キー、itは集約された要素群となります。
22Go

2019/06/08 08:17

e: float(e[-1]))というのは、e: float(e[2]))と同じ意味だと思うのですが、何かポイントがあるのでしょうか?質問ばかりですみません。
can110

2019/06/08 09:05

この場合は同じ意味でどちらでもよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問