`sorted(list)`と `list.sort()`の違いは何ですか?


194

list.sort() リストをソートして元のリストを置き換えますが、 sorted(list)並べ替えを変更せずに、リストの並べ替えられたコピーを返します。

  • どちらが他より好まれますか?
  • どちらがより効率的ですか?どれくらい?
  • リストをlist.sort()実行した後で、リストをソートされていない状態に戻すことはできますか?

4
もしあなた(誤って)コール用心sorted()文字列引数にしたが、それはリストだと思う、あなたはリストの結果ではなく、文字列を取得sorted("abcd", reverse=True)与え['d', 'c', 'b', 'a']ない"dcba"
SMCI

回答:


316

sorted()元のリストに影響を与えずに、新しいソートリストを返します。list.sort()リストをインプレースで並べ替え、リストのインデックスを変更して返しますNone(すべてのインプレース操作と同様)。

sorted()リストだけでなく、イテラブルで機能します。文字列、タプル、辞書(キーを取得します)、ジェネレータなど。すべての要素を含むリストを返し、ソートされます。

  • list.sort()リストsorted()を変更したい場合、新しくソートされたオブジェクトが必要な場合に使用します。まだsorted()リストではなく反復可能であるものをソートする場合に使用します。

  • リストの場合、コピーを作成する必要がないためlist.sort()よりも高速ですsorted()。他の反復​​可能オブジェクトについては、選択の余地はありません。

  • いいえ、元の位置を取得することはできません。一度呼び出すlist.sort()と元の注文は消えます。


6
一般的に、Python関数がを返すNone場合、それは操作であることがわかるサインです。そのため、印刷list.sort()したい場合はNoneを返します。
user1767754 2017年

45

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、私はその場でリストをソートする必要がある場合、それは私の使用を決定させます。


4
ジェネレーターの設定はいいですが、あなたが神話をあまりにも早く破ったという結論には至りません。sorted()新しいリストオブジェクトを割り当てて参照をコピーする必要があるという事実は残っています。残りのコードパスは同じです。より大きなリストで同じテストを実行できるかどうかを確認してください。ちょうどリストのコピーを作成し、それを比較し、あなたが見つけ違いなどに複製できるかどうか
マルタインピータース

11

主な違いは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()の後にリストの元の位置を取得できますか?

いいえ、元のリストを変更するためです。


1
print a.sort()何も印刷されません。
Burhan Khalid 2014年

1
それは印刷されますNone、私はそれを明確にします。
クリスチャン、

1

.sort()関数は、新しいリストの値をリスト変数に直接格納します。したがって、3番目の質問の答えはNOになります。また、sorted(list)を使用してこれを行うと、リスト変数に格納されないため、使用することができます。また、.sort()メソッドが関数として機能したり、引数をとったりすることもあります。

sorted(list)の値を変数に明示的に格納する必要があります。

また、短いデータ処理の場合、速度に違いはありません。しかし、長いリストの場合。高速で作業するには、直接.sort()メソッドを使用する必要があります。しかし、再びあなたは不可逆的な行動に直面します。


「.sort()関数は、新しいリストの値をリスト変数に直接格納します」どんな新しいリスト?新しいリストはありません。このlist.sort()メソッドは、リストオブジェクトをインプレースで並べ替えます。
PM 2Ring 2018

また、これはどういう意味ですか?「.sort()メソッドは関数として機能することもあれば、引数を取ることもある」
PM 2Ring 2018

新しいリストとは、変更されたリストであり、.sort()は変更されたリストを同じ変数に格納するだけです。
Vicrobot、

はい、絶対にときどき.sort()メソッドは引数を取り、関数として機能します。また、リストデータ型の属性であるため、メソッドと呼びます。
Vicrobot、

私のコンセプトにある種の間違いがある場合は教えてください、私はそれを探し、私のコンセプトを改善し、私の答えも改善します。ありがとう
Vicrobot 2018

1

次に、アクションの違いを確認するための簡単な例をいくつか示します。

ここに数字のリストを見てください:

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]

オリジナルとコピーをより深く表示していただきありがとうございます
ブレンダンメトカーフ

0

注:sort()とSorted()の最も単純な違いは次のとおりです。sort()は値を返しませんが、sorted()は反復可能なリストを返します。

sort()は値を返しません。

sort()メソッドは、特定のリストの要素を特定の順序(値を返さずに昇順または降順)で並べ替えるだけです。

sort()メソッドの構文は次のとおりです。

list.sort(key=..., reverse=...)

あるいは、同じ目的でPythonの組み込み関数sorted()を使用することもできます。ソートされた関数はソートされたリストを返します

 list=sorted(list, key=..., reverse=...)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.