[[プログラム周り]]
**複数の値を比較するソート [#d4ec909d]
pythonでソートをする際には、cmp(x,y)見たいなやり方をするのが一般的。
詳しくはこちらに書いてある[[Sorting Mini-HOWTO (和訳):http://www.python.jp/Zope/articles/tips/sorthowto]]。
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)
**ところで、まず、身長で並べて、同じ身長だったら、体重でソートするとかしたい場合は? [#e5f8e9a5]
っていう場合、どうすれば良いのだろうと思った。
たとえば、まず、身長の低い順に並べるけど、同じ高さなら、次は軽い順に並べるみたいなときはどうすればいいだろう。
どうやら、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()でその様に並べてくれるようです。