回答:
sorted()
元のリストに影響を与えずに、新しいソートリストを返します。list.sort()
リストをインプレースで並べ替え、リストのインデックスを変更して返しますNone
(すべてのインプレース操作と同様)。
sorted()
リストだけでなく、イテラブルで機能します。文字列、タプル、辞書(キーを取得します)、ジェネレータなど。すべての要素を含むリストを返し、ソートされます。
list.sort()
リストsorted()
を変更したい場合、新しくソートされたオブジェクトが必要な場合に使用します。まだsorted()
リストではなく反復可能であるものをソートする場合に使用します。
リストの場合、コピーを作成する必要がないためlist.sort()
よりも高速ですsorted()
。他の反復可能オブジェクトについては、選択の余地はありません。
いいえ、元の位置を取得することはできません。一度呼び出すlist.sort()
と元の注文は消えます。
None
場合、それは操作であることがわかるサインです。そのため、印刷list.sort()
したい場合はNoneを返します。
sorted(list)
vs はどう違いlist.sort()
ますか?
list.sort
リストをインプレースで変更して返す None
sorted
イテラブルを取り、ソートされた新しいリストを返します。sorted
これはこのPython実装と同等ですが、CPython組み込み関数はCで記述されているため、かなり高速に実行されます。
def sorted(iterable, key=None):
new_list = list(iterable) # make a new list
new_list.sort(key=key) # sort it
return new_list # return it
いつ使うの?
list.sort
あなたは(。したがって、あなたがメモリ内にインプレースリストを再利用することができるようになります)、元のソート順序を保持したくないときや、リストを他のコードとあなたによって共有されている場合は、リストの唯一の所有者(あるとき変更すると、そのリストが使用されているバグが発生する可能性があります。)sorted
元の並べ替え順序を保持する場合、またはローカルコードのみが所有する新しいリストを作成する場合に使用します。list.sort()の後にリストの元の位置を取得できますか?
いいえ-自分でコピーを作成しない限り、並べ替えはインプレースで行われるため、その情報は失われます。
「そして、どちらがより速いですか?そしてどれほど速いですか?」
新しいリストを作成するペナルティを説明するために、timeitモジュールを使用します。これが私たちのセットアップです。
import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)] # list of lists
for l in lists:
random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""
そして、これはランダムに配置された10000の整数のリストの結果です。ここでわかるように、古いリスト作成費用の神話は反証されています。
Python 2.7
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]
Python 3
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]
いくつかのフィードバックの後、別の特性を持つ別のテストが望ましいと判断しました。ここでは、1,000回の反復ごとに、ランダムに並べられた同じ長さ100,000の同じリストを提供します。
import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""
私は、Martijnによって言及されたコピーから生じたこのより大きな種類の違いを解釈しますが、これは、ここでのより古い人気のある回答で述べられている点を支配しません。ここで、時間の増加は約10%です
>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]
また、上記をはるかに小さいソートで実行しましたが、新しいsorted
コピーバージョンでは、1000の長さのソートでは実行時間が約2%長くなることがわかりました。
ポケは彼自身のコードも実行しました、これがコードです:
setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
print(t)
print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))
彼は1000000の長さの並べ替え(100回実行)で同様の結果を見つけましたが、時間の約5%の増加にすぎません。出力は次のとおりです。
10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655
sorted
コピーを作成して並べ替えられている大きなサイズのリストは、おそらく違いを支配しますが、並べ替え自体が操作を支配し、これらの違いを中心にコードを整理すると時期尚早の最適化になります。私が使用することになりsorted
、私はデータの新しいソートされたリストを必要とするとき、私は使用することになりlist.sort
、私はその場でリストをソートする必要がある場合、それは私の使用を決定させます。
sorted()
新しいリストオブジェクトを割り当てて参照をコピーする必要があるという事実は残っています。残りのコードパスは同じです。より大きなリストで同じテストを実行できるかどうかを確認してください。ちょうどリストのコピーを作成し、それを比較し、あなたが見つけ違いなどに複製できるかどうか
主な違いはsorted(some_list)
、新しいlist
を返すことです。
a = [3, 2, 1]
print sorted(a) # new list
print a # is not modified
そしてsome_list.sort()
、リストを所定の場所に並べ替えます:
a = [3, 2, 1]
print a.sort() # in place
print a # it's modified
注以来ということa.sort()
は何も返さない、print a.sort()
印刷されますNone
。
list.sort()の後にリストの元の位置を取得できますか?
いいえ、元のリストを変更するためです。
print a.sort()
何も印刷されません。
None
、私はそれを明確にします。
.sort()関数は、新しいリストの値をリスト変数に直接格納します。したがって、3番目の質問の答えはNOになります。また、sorted(list)を使用してこれを行うと、リスト変数に格納されないため、使用することができます。また、.sort()メソッドが関数として機能したり、引数をとったりすることもあります。
sorted(list)の値を変数に明示的に格納する必要があります。
また、短いデータ処理の場合、速度に違いはありません。しかし、長いリストの場合。高速で作業するには、直接.sort()メソッドを使用する必要があります。しかし、再びあなたは不可逆的な行動に直面します。
list.sort()
メソッドは、リストオブジェクトをインプレースで並べ替えます。
.sort()
メソッドは引数を取り、関数として機能します。また、リストデータ型の属性であるため、メソッドと呼びます。
次に、アクションの違いを確認するための簡単な例をいくつか示します。
ここに数字のリストを見てください:
nums = [1, 9, -3, 4, 8, 5, 7, 14]
呼び出す場合sorted
、このリストには、sorted
作成しますコピーリストのを。(元のリストの意味は変わりません。)
どれどれ。
sorted(nums)
戻り値
[-3, 1, 4, 5, 7, 8, 9, 14]
nums
もう一度見て
nums
元のリストが表示されます(変更されておらず、並べ替えられていません)。sorted
元のリストを変更しなかった
[1, 2, -3, 4, 8, 5, 7, 14]
同じnums
リストを取り、それにsort
関数を適用すると、実際のリストが変更されます。
どれどれ。
nums
念のため、リストから始めて、内容は同じです。
nums
[-3, 1, 4, 5, 7, 8, 9, 14]
nums.sort()
これで、元のnumsリストが変更され、numsを見ると、元のリストが変更され、ソートされていることがわかります。
nums
[-3, 1, 2, 4, 5, 7, 8, 14]
注:sort()とSorted()の最も単純な違いは次のとおりです。sort()は値を返しませんが、sorted()は反復可能なリストを返します。
sort()は値を返しません。
sort()メソッドは、特定のリストの要素を特定の順序(値を返さずに昇順または降順)で並べ替えるだけです。
sort()メソッドの構文は次のとおりです。
list.sort(key=..., reverse=...)
あるいは、同じ目的でPythonの組み込み関数sorted()を使用することもできます。ソートされた関数はソートされたリストを返します
list=sorted(list, key=..., reverse=...)
sorted()
文字列引数にしたが、それはリストだと思う、あなたはリストの結果ではなく、文字列を取得:sorted("abcd", reverse=True)
与え['d', 'c', 'b', 'a']
ない"dcba"