2

繰り返しの名前を持つ一連のペア(名前、スコア)があります。それぞれの名前の最大スコアを取得したいと思います。名前ラベル自体は、最終結果ではオプションです。これは実用的な実装です:

from collections import defaultdict
scores = (('eyal', 76), ('alex', 50), ('oded', 90), ('eyal', 100), ('alex', 99))
distinct = defaultdict(set)
for score in scores:
    distinct[score[0]].add(score[1])
max_scores = [max(distinct[k]) for k in distinct]
print (max_scores)

私は疑問に思っています、これは辞書内包表記を使用して1つのステップで実行できますか?

4

1 に答える 1

5
In [22]: dict(sorted(scores))
Out[22]: {'alex': 99, 'eyal': 100, 'oded': 90}

これは、タプルをソートしたら、すべての名前の最後のタプルのみを保持したいという観察に基づいており、dict()それをうまく実行しています。

あるいは、

In [16]: [max(vals) for _,vals in itertools.groupby(sorted(scores), lambda x:x[0])]
Out[16]: [('alex', 99), ('eyal', 100), ('oded', 90)]

これはより冗長ですが、より一般的でもあります。たとえば、平均スコアを計算するように簡単に適合させることができますが、最初のソリューションはできません。

于 2012-12-14T17:34:21.840 に答える