ProgrammingPython開発者

Pythonのsorted()関数はどのように機能し、リストのsort()メソッドとは何が違うのか、key引数とreverseパラメータを使用する際の注意点は何ですか?

Hintsage AIアシスタントで面接を突破

回答。

問題の背景:

Pythonは初めからコレクションをソートするための組み込みツールを提供していました。sort()メソッドとsorted()関数はPythonの第2版で登場しましたが、Python 2.4からは、sorted()が任意の反復可能オブジェクトをソートするための汎用手段として導入されました(リストだけでなく)。

問題:

データを異なる基準でソートする必要がある場合が多く、常に元のオブジェクトを変更したくないことがあります。初心者はsort()とsorted()を混同し、各々の使用場所を理解せず、ソートキーや逆順での誤りを犯すことがあります。

解決策:

  • sorted(反復可能オブジェクト, key=None, reverse=False)は常に新しいリストオブジェクトを返し、元のものを変更しません。
  • list.sort(key=None, reverse=False)はリストをその場でソートし、Noneを返します。
  • keyパラメータは、どの基準でソートするかを決定する関数です。
  • reverse=Trueは順序を逆にします。

文字列のリストをその長さで逆順にソートする例:

words = ['python', 'is', 'strong', 'language'] sorted_words = sorted(words, key=len, reverse=True) print(sorted_words) # ['language', 'python', 'strong', 'is']

主な特徴:

  • sorted()は常に新しいリストを返し、元のデータを触れません。
  • sort()は元のリストのみを操作し、新しいオブジェクトを返しません。
  • keyオプションは、比較のための値を返す任意の関数にできます。

ひっかけ問題。

sort()メソッドは何を返しますか?

list.sort()メソッドはリストをソートし、常にNoneを返すことが、しばしば忘れられます。

lst = [3, 1, 2] res = lst.sort() print(res) # None print(lst) # [1, 2, 3]

sort()を使用してタプルをソートできますか?

できません。タプルは不変であり、.sort()メソッドはありません。ソートするにはsorted()を使用してください。

tuple_data = (5,2,3) sorted_tuple = sorted(tuple_data) print(sorted_tuple) # [2, 3, 5]

keyに異なる型を返す関数を指定したらどうなりますか?

返される値が互いに比較できない場合(例えば、intとstr)、TypeErrorが発生します。

一般的なエラーとアンチパターン

  • 新しいソートされたリストを期待してsort()を使用する。
  • 不変のオブジェクトをsort()メソッドでソートしようとする。
  • keyに異なる型の値を返す関数を提供する。

実生活の例

ネガティブケース

面接で長さでソートされたリストを返すように求められ、候補者が次のようにします:

lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None

利点:

  • リストをその場で変更する(時にはメモリを節約する)。

欠点:

  • Noneを返し、それが後続のロジックを壊す。

ポジティブケース

正しい使用:

lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']

利点:

  • 元のリストは変更されません。
  • 期待された結果が得られます。

欠点:

  • 新しいリストのために追加のメモリを消費します。