複数の値を比較するソート †pythonでソートをする際には、cmp(x,y)見たいなやり方をするのが一般的。 詳しくはこちらに書いてあるSorting Mini-HOWTO (和訳)。 classの中に__cmp__(self,other):と言う関数を作って、そのクラスから作ったインスタンスの配列に対して、hoge.sort()と言う風にすれば、その順序に、整列された配列が手に入る。 上のHowToに出ている例ではこんな感じ。 class Spam:
def __init__(self, spam, eggs):
self.spam = spam
self.eggs = eggs
def __cmp__(self, other):
return cmp(self.spam + self.eggs, other.spam + other.eggs)
def __str__(self):
return str(self.spam + self.eggs)
a = [Spam(1, 4), Spam(9, 3), Spam(4, 6)]
a.sort()
for spam in a:
print str(spam)
ところで、まず、身長で並べて、同じ身長だったら、体重でソートするとかしたい場合は? †っていう場合、どうすれば良いのだろうと思った。 たとえば、まず、身長の低い順に並べるけど、同じ高さなら、次は軽い順に並べるみたいなときはどうすればいいだろう。 どうやら、cmpは単純に、-1,0,1を返すので、0(等しい)場合は、次のcmpで、並べ替えれるみたいだ。 import random
class CmpTest:
def __init__(self,tall,wei):
self.tall=tall
self.wei=wei
def __cmp__(self,other):
c=cmp(self.tall,other.tall)
if c==0:
c=cmp(self.wei,other.wei)
return c
def main():
k=[]
for i in range(20):
t=random.randint(1,3)
w=random.randint(1,100)
k.append(CmpTest(t,w))
print "-"*20
for p in k:
print p.tall,p.wei
k.sort()
print "-"*20
for p in k:
print p.tall,p.wei
print '-'*20
if __name__=='__main__':
main()
で書いたプログラムがこれ。 前 2 21 1 46 2 42 3 69 3 29 3 47 1 17 1 13 1 92 3 40 2 61 2 83 3 12 3 52 2 71 3 2 1 22 2 44 2 74 2 9 後 1 13 1 17 1 22 1 46 1 92 2 9 2 21 2 42 2 44 2 61 2 71 2 74 2 83 3 2 3 12 3 29 3 40 3 47 3 52 3 69 肝は、 def __cmp__(self,other):
c=cmp(self.tall,other.tall)
if c==0:
c=cmp(self.wei,other.wei)
return c
の部分、もし、同じ身長(c==0)なら、次は体重を比べろという風に書く。 そうすると、k.sort()でその様に並べてくれるようです。 |