Pythonのsort(), sorted(), reverse(), reversed()の使い方


このエントリーをはてなブックマークに追加

いまだに混乱してしまうのでメモ。Python3でテストしていますがPython2でも同じはずです。

sort()

list.sort()という形で使います。元のリスト自体の中身が変わります。Rubyでいう「破壊的メソッド」にあたります。

nums = [2, 4, 1, 6]
nums.sort()  # 破壊的
print(nums)  # nums = [1, 2, 4, 6] となる

降順にソートするときは、reverse=Trueとします。

nums = [2, 4, 1, 6]
nums.sort(reverse=True) # 降順にソート
print(nums) # nums = [6, 4, 2, 1] となる

sorted()

sorted(list)という形で使うとソート済のリストが戻ります。この場合は元のリスト自体には影響を与えません。

nums = [2, 4, 1, 6]
print(sorted(nums)) # [1, 2, 4, 6]
print(nums) # [2, 4, 1, 6]のまま
nums = sorted(nums) # こう書くとnums.sort()と同じ結果

reverse()

list.reverse()という形で使います。list.sort()と同じく元のリスト自体の中身が変わります。

nums = [2, 4, 1, 6]
nums.reverse() # 破壊的
print(nums) # [6, 1, 4, 2]

reversed()

reversed(list)という形で使います。sorted(list)とは異なり、イテレータが戻ります。

nums = [2, 4, 1, 6]
print(reversed(nums)) # リストではなくイテレータが戻る (e.g. <list_reverseiterator object at 0xb7180b6c>)
nums = list(reversed(nums)) # こうすると nums.reverse()と同じになる ([6, 1, 4, 2])

メソッドチェーンは不可

nums.sort().reverse()と書きたくなりますができません(参考:PythonでもRubyみたいに配列をメソッドチェーンでつなげたい - by edvakf in hatena)。