pythonでソート

pythonでソート

リストをソートしたい

条件がシンプルな場合は、リストをそのままソートしてしまえばよい。

1
2
3
olist = [5, 3, 1, 2, 4]
olist.sort()
print(olist)

単純なリストであれば、破壊的にソートしてもよいと思うが、
リストを分けたいときはsortedを呼び出す。

1
2
3
olist = [5, 3, 1, 2, 4]
slist = sorted(olist)
print(slist)

タプルのリストをソートしたい

リストにタプルを詰めて、タプルの何番目かの情報でソートしたい。

1
2
3
olist = [('a', 5), ('c', 3), ('e', 1), ('d', 2), ('b', 4)]
slist = sorted(olist, key = lambda x : x[1])
print(slist)

この例では、タプルの2番目(配列の添字は1)の項目を基準にソートしている。

クラスのリストをソートしたい

リストにクラスを詰めて、クラスのプロパティでソートしたい。

1
2
3
4
5
6
7
8
9
10
11
12
class Dto:
    def __init__(self, id, name):
        self.id = id
        self.name = name
    def __repr__(self):
        return '[{0}:{1}]'.format(self.id, self.name)

olist = [
    Dto(5, 'a'), Dto(3, 'c'), Dto(1, 'e'), Dto(2, 'd'), Dto(4, 'b')
]
slist = sorted(olist, key = lambda x : x.name)
print(slist)

この例では、クラスのnameプロパティでソートしている。

文字列として格納した数値のリストを数値としてソートしたい

1
2
3
olist = ['1', '11', '111', '2', '22', '3', '33']
slist = sorted(olist, key = lambda x : int(x))
print(slist)

ソートのキーのみ数値として認識させているので、ソート結果の内容は文字列のままになっている。

逆順ソート

1
2
3
4
5
6
olist = [5, 3, 1, 2, 4]
slist = sorted(olist, reverse = True)
print(slist)
print(olist)
olist.sort(reverse = True)
print(olist)

reverse引数にTrueを指定すると逆順ソートが可能になる。

ソートではないが、リストのフィルタリングを行いたい

偶数のみ抽出

1
2
3
olist = [5, 3, 1, 2, 4]
flist = list(filter(lambda x : x % 2 == 0, olist))
print(flist)
1
2
3
olist = [('a', 5), ('c', 3), ('e', 1), ('d', 2), ('b', 4)]
slist = list(filter(lambda x : x[1] % 2 == 0, olist))
print(slist)
1
2
3
4
5
6
7
8
9
10
11
12
class Dto:
    def __init__(self, id, name):
        self.id = id
        self.name = name
    def __repr__(self):
        return '[{0}:{1}]'.format(self.id, self.name)

olist = [
    Dto(5, 'a'), Dto(3, 'c'), Dto(1, 'e'), Dto(2, 'd'), Dto(4, 'b')
]
slist = list(filter(lambda x : x.id % 2 == 0, olist))
print(slist)

まとめ

ソートは出力時に是非行いたい。
フィルターは、リストやマップに入れる前に条件を付ければよい気がする。

同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA