69797


プレイヤーというクラスをつくりました。そのオブジェクトであるプレイヤー１…nのそれぞれはインスタンス変数に、（名前,取得したポイント）を持っています。  
今、（取得したポイント）が最大のプレイヤーの（名前）を表示させたいです。  
つまり、

[code]

    class Player:
    def __init__(self,name,score):
        self.name=name
        self.score=score
    
[/code]

p1=Player("Taro",10)  
p2=Player("jiro",12)  
p3=Player("saburo",9)

において最高スコアの保持者であるジローの名前を出力したいです。

maxのモジュールでいけそうなのですが、どう使えばいいのか分かりません。教えてください。よろしくお願いします。


CC BY-SA 4.0
2020-08-23T08:03:02.460
69792
2020-08-24T12:24:26.750
2020-08-23T09:27:38.147
41334
41334
question
python python3
maxの使い方を教えて下さい


> 最高スコアの保持者であるジローの名前を出力したいです

# オブジェクトの属性を比較対象としてmaxを使用した例

オブジェクトの属性（今回であれば`score`）を比較対象としたmaxの使い方が下記です。

[code]

    class Player:
      def __init__(self,name,score):
        self.name=name
        self.score=score
    
    p1=Player("Taro",10)
    p2=Player("jiro",12)
    p3=Player("saburo",9)
    
    max_p = max(p1, p2, p3, key=lambda p: p.score)
    
    print(max_p.name)
    
[/code]

実行結果:

[code]

    jiro
    
[/code]

## 同点のものがある場合

Python3では複数の項目が最大の場合は最初に見つかったものが返ってくるとドキュメントに明記されているようです。

<https://docs.python.org/3/library/functions.html#max>

> If multiple items are maximal, the function returns the first one
> encountered. This is consistent with other sort-stability preserving tools
> such as sorted(iterable, key=keyfunc, reverse=True)[0] and heapq.nlargest(1,
> iterable, key=keyfunc).

## 参考資料

[python max function using 'key' and lambda expression - Stack
Overflow](https://stackoverflow.com/questions/18296755/python-max-function-
using-key-and-lambda-expression)

[max - Which maximum does Python pick in the case of a tie? - Stack
Overflow](https://stackoverflow.com/questions/6783000/which-maximum-does-
python-pick-in-the-case-of-a-tie) の
[回答](https://stackoverflow.com/a/44153522/1979953)

# 最大値が同じものがある場合は複数取り出したい

> ありがとうございます。出力できました。一つだけしかpick
> upされないのが難儀です。自分でも考えてみますが、shingoさんならどのようにコードされますか？

max関数だけでは無理なので、工夫しましょう。  
**Taroとjiroを最高点で同点にしてあります** 。

[code]

    class Player:
      def __init__(self,name,score):
        self.name=name
        self.score=score
    
    p1=Player("Taro",12)
    p2=Player("jiro",12)
    p3=Player("saburo",9)
    
    players = [p1, p2, p3]
    
    max_p = max(players, key=lambda p: p.score)
    max_players = [p for p in players if p.score == max_p.score]
    
    for p in max_players:
      print(p.name)
    
[/code]

実行結果:

[code]

    Taro
    jiro
    
[/code]

## 参考資料

[python - How to find multiple max value items in a list - Stack
Overflow](https://stackoverflow.com/questions/21893808/how-to-find-multiple-
max-value-items-in-a-
list)の[コメント](https://stackoverflow.com/questions/21893808/how-to-find-
multiple-max-value-items-in-a-list#comment84093690_21894160)

### ちなみに

典型的な（プログラミングをはじめて学ぶときに練習する）Maxを求めるアルゴリズムは [How to find the max number(s) in a
list with tied numbers](https://stackoverflow.com/questions/21861730/how-to-
find-the-max-numbers-in-a-list-with-tied-
numbers/21861887#21861887)の質問への[この解法](https://stackoverflow.com/a/21861887/1979953)の下記のものです。

引用:

[code]

    maxval = None
    for index, val in enumerate(my_list):
        if maxval is None or val > maxval:
            indices = [index]
            maxval = val
        elif val == maxval:
            indices.append(index)
    
[/code]

もちろん、これは単なる引用ですから、このアルゴリズムが必要な場合は、ご自身が使いたい形に変えて使用しましょう。（このコードはindexしか取得していません）

### 蛇足

こんな書き方や

[code]

    class Player:
      def __init__(self,name,score):
        self.name=name
        self.score=score
    
    players = [Player("Taro",12), Player("jiro",12), Player("saburo",9)]
    max_score = max(players, key=lambda p: p.score).score
    max_players = [p for p in players if p.score == max_score]
    print("\n".join(map(lambda p: p.name, max_players)))
    
[/code]

実行結果:

[code]

    Taro
    jiro
    
[/code]

こんな書き方もできます

[code]

    class Player:
      def __init__(self,name,score):
        self.name=name
        self.score=score
    
    players = [Player("Taro",12), Player("jiro",12), Player("saburo",9)]
    max_score = max(players, key=lambda p: p.score).score
    max_player_names = [p.name for p in players if p.score == max_score]
    print("\n".join(max_player_names))
    
[/code]

実行結果:

[code]

    Taro
    jiro
    
[/code]


CC BY-SA 4.0
2020-08-23T09:39:55.597
69797
2020-08-24T12:24:26.750
2020-08-24T12:24:26.750
9008
9008
69792
answer