いまだに混乱してしまうのでメモ。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)。