list.sort()と sorted(list)の 2 つ。
まずは → を読むべし。https://docs.python.org/ja/3/howto/sorting.html
オブジェクトの配列をソートするとかする場合はkey関数を使う。
性能とか
import random import time time_sta = time.perf_counter() for i in range(10000): numl = [random.randint(1, 1000) for i in range(100)] numl.sort() time_end = time.perf_counter() tspan = time_end- time_sta print(tspan) time_sta = time.perf_counter() for i in range(10000): numl = [random.randint(1, 1000) for i in range(100)] sorted(numl) time_end = time.perf_counter() tspan = time_end- time_sta print(tspan) # どっちも大差無 3.690590940999982 3.6823944669999946
昇順/降順
numl = [random.randint(1, 1000) for i in range(100)] print(numl.sort(reverse=True)) print(sorted(numl, reverse=True))
両者の違い
numl = [random.randint(1, 1000) for i in range(10)] print(numl) print(numl.sort()) print(numl) [746, 897, 3, 989, 2, 216, 666, 852, 387, 409] None [2, 3, 216, 387, 409, 666, 746, 852, 897, 989] numl = [random.randint(1, 1000) for i in range(10)] print(numl) print(sorted(numl)) print(numl) [931, 793, 220, 503, 827, 961, 114, 530, 30, 528] [30, 114, 220, 503, 528, 530, 793, 827, 931, 961] [931, 793, 220, 503, 827, 961, 114, 530, 30, 528]
`list.sort()`は破壊的
`sorted(list)`は非破壊的
で、基本的には`sorted()`を使った方が良さそう。
Key 関数の使い方と性能
使い方
import random,string,time from operator import itemgetter, attrgetter dicl = [{"key": randomname(5),"val":random.randint(1, 1000)} for i in range(5)] print( sorted(dicl,key=lambda x:x["key"]) ) print( sorted(dicl,key=lambda x:x["val"]) ) print( sorted(dicl,key=itemgetter("key")) ) print( sorted(dicl,key=itemgetter("val")) )
性能
import random,string,time from operator import itemgetter, attrgetter dicl = [{"key": randomname(5),"val":random.randint(1, 1000)} for i in range(1000)] time_sta = time.perf_counter() for i in range(10000): sorted(dicl,key=lambda x:x["key"]) time_end = time.perf_counter() tspan = time_end- time_sta print(tspan) time_sta = time.perf_counter() for i in range(10000): sorted(dicl,key=itemgetter("key")) time_end = time.perf_counter() tspan = time_end- time_sta print(tspan) 7.373934460000328 6.795032753000214
`itemgetter` 使いましょう。
色んなデータ構造でソート
# 単純なList numl = [random.randint(1, 1000) for i in range(5)] print(sorted(numl)) print(sorted(numl,reverse=True)) # 辞書 dicl = [{"key": randomname(5),"val":random.randint(1, 1000)} for i in range(5)] print(sorted(dicl,key=itemgetter("key"))) print(sorted(dicl,key=itemgetter("val"),reverse=True)) print(sorted(dicl,key=itemgetter("val","key")))# 複数キーのソート # タプル tupl = [(randomname(5),random.randint(1, 100), random.randint(200, 300) ,) for i in range(5)] print(sorted(tupl,key=itemgetter(0))) print(sorted(tupl,key=itemgetter(2),reverse=True)) print(sorted(tupl,key=itemgetter(2,0)))# 複数キーのソート # オブジェクト objl = [SampleClass(randomname(5),random.randint(1, 100)) for i in range(5)] print(sorted(objl,key=attrgetter("name"))) print(sorted(objl,key=attrgetter("val"),reverse=True)) print(sorted(objl,key=attrgetter("val","name")))# 複数キーのソート class SampleClass: def __init__(self,name,val): self.name = name self.val = val