通常のソート
pythonでListをソートしたい場合、下記のようにsort()関数を使うと簡単にソートしてくれる
>>> l = ['B', 'C', 'A']
>>> l.sort()
>>> print l
['A', 'B', 'C']
しかし、.file
などのドットを含むファイルリストのソートなどを行うと下記のようにドットを含むファイルが先に並んでしまう。
>>> files = ['file01', 'file02', '.file04', 'file03']
>>> files.sort()
>>> print files
['.file04', 'file01', 'file02', 'file03']
lambda式を使った独自ソート
たとえば、lsコマンドの出力のようにドットを含まない部分でソートしたい場合lambda式を使い下記のようにすると実現できる。
>>> files = ['file01', 'file02', '.file04', 'file03']
>>> sortKey = lambda f: f if not f.startswith('.') else f[1:]
>>> files.sort(key=sortKey)
>>> print files
['file01', 'file02', 'file03', '.file04']
sortKeyでソートのためのkeyの生成方法を指定している。
具体的にはソートの対象をf
として渡し、f.startswith('.')
で先頭にドットがある場合は2文字目からを切り出してkeyとしている。
その他の応用
たとえば次のようにすることでファイルのサイズでリストをソートーすることもできる
>>> import os
>>> files = ['file01', 'file02', '.file04', 'file03']
>>> sortKey = lambda f: os.state(f).st_size
>>> files.sort(key=sortKey)