ユーザ定義クラスの既存アルゴリズムへの適用2

今日先輩から教えてもらい6月9日の自分の日記の問題に対するうまいやり方が分かった。以下の通り。

class A:
    def __init__(self, id, val):
        self.id = id
        self.val = val
    def __repr__(self):
        return 'A(%d, %d)' % (self.id, self.val)
    
as = [A(1, 1), A(2, 2), A(3, 0), A(4, 4)]

print min( (a.val, a) for a in as )[1].id

# 実行結果
3

Python 2.5でmin()は拡張されるらしいので、もっと簡潔に書けると思うが、このコードであれば結構古いバージョンでもいけると思う。min()関数の中はジェネレータを使用したが、もちろんリスト内包表記でリストを渡しても良い。


上記のA => A.idでなく、A.id => Aという逆参照をタプルによって表現するという手法は結構使えそうである。Pythonでは、==の評価は、オペランドがリストやタプルの場合でも要素を1つづつ全て比較してくれるので比較したい対象を1番目に持ってきておけば、比較を伴うビルトインやライブラリのアルゴリズムに適用できる。