list.sort

sortを使うとリストを並び替えることができます。

l = ['apple', 'orange', 'banana']

# 辞書順に並び替えられる
l.sort()
print l
# => ['apple', 'banana', 'orange']

import random

# リストの要素をタプルにすると……
l = [(i, random.randint(1, 100)) for i in l]
print l
# => [('apple', 76), ('banana', 20), ('orange', 21)]

# 要素の第一要素を比較して並び替えられる
l.sort()
print l
# => [('apple', 76), ('banana', 20), ('orange', 21)]

# 数値を第一要素とするタプルを要素とするリストだと……
l = [(random.randint(1, 100), i) for i in l]
print l
# => [(97, ('apple', 76)), (52, ('banana', 20)), (8, ('orange', 21))]

# 数値の昇順に並べ替えられる
l.sort()
print l
# => [(8, ('orange', 21)), (52, ('banana', 20)), (97, ('apple', 76))]

引数cmp、key、reverseを渡すことで、好きな方法で並べ替えることができます。


cmpには引数を二つ受け取り、大小を返す関数を渡すことができます。このとき第一引数が第二引数より小さかったら負の値を同じ場合は0を、大きい場合は正の値を返すようにする、という決まりがあります。

class Fruit:
  def __init__(self, name, value):
    self.name = name
    self.value = value

  def __repr__(self):
    return self.name + ':' + str(self.value) + 'yen'

l = [Fruit('apple', 120), Fruit('orange', 100), Fruit('banana', 150), Fruit('dragon-fruit', 3000)]

# 引数なしだと__repr__の返り値(文字列)を辞書順に並べ替えるらしい
l.sort()
print l
# => [apple:120yen, banana:150yen, orange:100yen, dragon-fruit:3000yen]

# valueを17で割ったあまりが小さい順に並べ替える
l.sort(cmp=lambda x, y: cmp(x.value%17, y.value%17))
print l
# => [apple:120yen, dragon-fruit:3000yen, banana:150yen, orange:100yen]

# nameが長い順に並べ替える
l.sort(cmp=lambda x, y: len(y.name) - len(x.name))
print l
# => [dragon-fruit:3000yen, banana:150yen, orange:100yen, apple:120yen]

keyには引数を一つ受け取る関数を渡すことができます。渡された関数はリストの要素を取り出すときに使われます。

# 要素のvalueで比較して昇順で並べ替える
l.sort(key=lambda x: x.value)
print l
# => [orange:100yen, apple:120yen, banana:150yen, dragon-fruit:3000yen]

# valueを17で割ったあまりが小さい順に並べ替える
l.sort(key=lambda x: x.value%17)
print l
# => [apple:120yen, dragon-fruit:3000yen, banana:150yen, orange:100yen]

reverseにはTrueかFalseを渡すことができます。reverseがTrueの場合は逆順に並び替えられます。

# 要素のvalueで比較して降順で並べ替える
l.sort(key=lambda x: x.value, reverse=True)
print l
# => [dragon-fruit:3000yen, banana:150yen, apple:120yen, orange:100yen]