list.sort()
mengurutkan daftar dan mengganti daftar asli, sedangkan sorted(list)
mengembalikan salinan daftar yang diurutkan, tanpa mengubah daftar asli.
- Kapan satu lebih disukai daripada yang lain?
- Mana yang lebih efisien? Seberapa banyak?
- Bisakah daftar dikembalikan ke status tidak disortir setelah
list.sort()
dilakukan?
sorted()
argumen string tetapi berpikir itu adalah daftar, Anda mendapatkan hasil daftar, bukan string :sorted("abcd", reverse=True)
memberi['d', 'c', 'b', 'a']
tidak"dcba"
Jawaban:
sorted()
mengembalikan daftar diurutkan baru , meninggalkan daftar asli tidak terpengaruh.list.sort()
mengurutkan daftar di tempat , memutasikan indeks daftar, dan mengembalikanNone
(seperti semua operasi di tempat).sorted()
bekerja pada semua iterable, bukan hanya daftar. String, tuple, kamus (Anda akan mendapatkan kunci), generator, dll., Mengembalikan daftar yang berisi semua elemen, diurutkan.Gunakan
list.sort()
saat Anda ingin mengubah daftar,sorted()
saat Anda ingin objek yang diurutkan kembali. Gunakansorted()
ketika Anda ingin mengurutkan sesuatu yang merupakan iterable, bukan daftar belum .Untuk daftar,
list.sort()
lebih cepat daripadasorted()
karena tidak harus membuat salinan. Untuk pilihan lain, Anda tidak punya pilihan.Tidak, Anda tidak dapat mengambil posisi semula. Setelah Anda menelepon
list.sort()
, orde asli hilang.sumber
None
, itu adalah tanda, bahwa operasi dilakukan di tempat, itu sebabnya, ketika Anda ingin mencetaknyalist.sort()
mengembalikan Tidak ada.list.sort
mengubah daftar di tempat & mengembalikanNone
sorted
mengambil setiap iterable & mengembalikan daftar baru, disortir.sorted
setara dengan implementasi Python ini, tetapi fungsi built-in CPython harus berjalan lebih cepat seperti yang tertulis dalam C:list.sort
ketika Anda tidak ingin mempertahankan urutan pengurutan asli (Dengan demikian Anda akan dapat menggunakan kembali daftar di tempat dalam memori.) Dan ketika Anda adalah satu-satunya pemilik daftar (jika daftar dibagi oleh kode lain dan Anda mutasi itu, Anda bisa memperkenalkan bug di mana daftar itu digunakan.)sorted
ketika Anda ingin mempertahankan urutan pengurutan asli atau ketika Anda ingin membuat daftar baru yang hanya dimiliki oleh kode lokal Anda.Tidak - kecuali Anda membuat salinan sendiri, informasi itu hilang karena pengurutan dilakukan di tempat.
Untuk mengilustrasikan penalti membuat daftar baru, gunakan modul timeit, inilah pengaturan kami:
Dan inilah hasil kami untuk daftar 10.000 bilangan bulat yang disusun secara acak, seperti yang dapat kita lihat di sini, kami telah menyangkal mitos biaya pembuatan daftar yang lebih lama :
Python 2.7
Python 3
Setelah beberapa umpan balik, saya memutuskan tes lain akan diinginkan dengan karakteristik berbeda. Di sini saya memberikan daftar 100.000 panjang yang dipesan secara acak yang sama untuk setiap iterasi 1.000 kali.
Saya menafsirkan perbedaan jenis yang lebih besar ini berasal dari penyalinan yang disebutkan oleh Martijn, tetapi itu tidak mendominasi sampai titik yang dinyatakan dalam jawaban yang lebih lama lebih populer di sini, di sini peningkatan waktu hanya sekitar 10%
Saya juga menjalankan di atas pada jenis yang jauh lebih kecil, dan melihat bahwa
sorted
versi salinan baru masih membutuhkan waktu sekitar 2% lebih lama pada 1000 panjang.Poke juga menjalankan kodenya sendiri, inilah kodenya:
Dia menemukan untuk jenis panjang 1000000, (berlari 100 kali) hasil yang sama, tetapi hanya sekitar 5% peningkatan waktu, inilah hasilnya:
Kesimpulan:
Daftar berukuran besar yang disortir dengan
sorted
membuat salinan kemungkinan akan mendominasi perbedaan, tetapi penyortiran itu sendiri mendominasi operasi, dan mengatur kode Anda di sekitar perbedaan-perbedaan ini akan menjadi optimasi prematur. Saya akan menggunakansorted
ketika saya membutuhkan daftar data yang baru disortir, dan saya akan menggunakanlist.sort
ketika saya perlu mengurutkan daftar di tempat, dan biarkan yang menentukan penggunaan saya.sumber
sorted()
harus mengalokasikan objek daftar baru dan menyalin referensi; sisa jalur kode identik. Lihat apakah Anda dapat menjalankan tes yang sama dengan daftar yang lebih besar. Bandingkan dengan hanya membuat salinan daftar dan lihat apakah Anda dapat meniru perbedaan yang Anda temukan, dll.Perbedaan utama adalah bahwa
sorted(some_list)
mengembalikan yang barulist
:dan
some_list.sort()
, urutkan daftar di tempat :Perhatikan bahwa karena
a.sort()
tidak mengembalikan apa pun,print a.sort()
akan dicetakNone
.Bisakah daftar posisi asli diambil setelah list.sort ()?
Tidak, karena memodifikasi daftar asli.
sumber
print a.sort()
tidak akan mencetak apa pun.None
, saya akan mengklarifikasi itu.Fungsi .sort () menyimpan nilai daftar baru secara langsung dalam variabel daftar; jadi jawaban untuk pertanyaan ketiga Anda adalah TIDAK. Juga jika Anda melakukan ini menggunakan diurutkan (daftar), maka Anda bisa menggunakannya karena tidak disimpan dalam variabel daftar. Kadang-kadang metode .sort () berfungsi sebagai fungsi, atau mengatakan bahwa dibutuhkan argumen di dalamnya.
Anda harus menyimpan nilai yang diurutkan (daftar) dalam variabel secara eksplisit.
Juga untuk pemrosesan data singkat kecepatan tidak akan memiliki perbedaan; tetapi untuk daftar panjang; Anda harus langsung menggunakan metode .sort () untuk pekerjaan cepat; tetapi sekali lagi Anda akan menghadapi tindakan yang tidak dapat diubah.
sumber
list.sort()
metode mengurutkan daftar objek di tempat..sort()
metode mengambil argumen, dan bertindak sebagai fungsi. Kami juga menyebutnya metode karena merupakan atribut dari tipe data daftar.Berikut adalah beberapa contoh sederhana untuk melihat perbedaan dalam tindakan:
Lihat daftar angka di sini:
Saat memanggil
sorted
daftar ini,sorted
akan membuat salinan daftar. (Artinya daftar asli Anda akan tetap tidak berubah.)Ayo lihat.
kembali
Melihat
nums
lagiKami melihat daftar asli (tidak diubah dan TIDAK diurutkan.)
sorted
tidak mengubah daftar asliMengambil
nums
daftar yang sama dan menerapkansort
fungsi di atasnya, akan mengubah daftar yang sebenarnya.Ayo lihat.
Dimulai dengan
nums
daftar kami untuk memastikan, kontennya masih sama.Sekarang daftar num asli diubah dan melihat num kita melihat daftar asli kita telah berubah dan sekarang disortir.
sumber
sort () tidak mengembalikan nilai apa pun.
Metode sort () hanya mengurutkan elemen daftar yang diberikan dalam urutan tertentu - Naik atau Turun tanpa mengembalikan nilai.
Sintaks metode sort () adalah:
sumber