Saya tahu bahwa ini terdengar sepele tetapi saya tidak menyadari bahwa sort()
fungsi Python itu aneh. Saya memiliki daftar "angka" yang sebenarnya dalam bentuk string, jadi saya mengonversinya terlebih dahulu menjadi int, kemudian mencoba mengurutkan.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
Memberi saya:
['1', '10', '2', '200', '22', '23', '3', '4']
Yang saya inginkan adalah
['1','2','3','4','10','22','23','200']
Saya telah melihat-lihat beberapa algoritma yang terkait dengan pengurutan set numerik, tetapi yang saya temukan semuanya melibatkan pengurutan set alfanumerik.
Saya tahu ini mungkin masalah yang tidak perlu dipikirkan, tetapi google dan buku teks saya tidak menawarkan sesuatu yang lebih atau kurang berguna daripada .sort()
fungsinya.
list1
. Apa yang membuat Anda berpikirlist
sedang diperbarui?sorted(mylist)
Jawaban:
Anda belum benar-benar mengubah string Anda menjadi int. Atau lebih tepatnya, Anda melakukannya, tetapi kemudian Anda tidak melakukan apa pun dengan hasilnya. Yang Anda inginkan adalah:
Jika karena alasan tertentu Anda perlu menyimpan string alih-alih int (biasanya ide yang buruk, tapi mungkin Anda perlu mempertahankan nol di depan atau sesuatu), Anda dapat menggunakan fungsi kunci .
sort
mengambil parameter bernamakey
, yang merupakan fungsi yang dipanggil pada setiap elemen sebelum dibandingkan. Nilai yang dikembalikan dari fungsi kunci akan dibandingkan, bukan membandingkan elemen daftar secara langsung:sumber
list1 = list1.sort(key=int)
, gunakan sajalist1.sort(key=int)
dan list1 sudah akan diurutkan.Anda bisa melewati fungsi dari
key
parameter untuk para.sort
metode . Dengan ini, sistem akan mengurutkan berdasarkan kunci (x), bukan x.BTW, untuk mengubah daftar untuk bilangan bulat secara permanen, gunakan yang
map
fungsiatau pemahaman daftar
sumber
Jika Anda ingin menggunakan
sorted()
fungsi:sorted(list1, key=int)
Ini mengembalikan daftar diurutkan baru.
sumber
Jenis Python tidak aneh. Hanya saja kode ini:
tidak melakukan apa yang Anda pikirkan -
item
tidak diganti kembali ke dalam daftar, tetapi dibuang begitu saja.Bagaimanapun, solusi yang benar adalah menggunakan
key=int
seperti yang ditunjukkan orang lain kepada Anda.sumber
Anda juga bisa menggunakan:
Ini sangat mirip dengan hal lain yang dapat Anda temukan di internet tetapi juga berfungsi untuk alfanumerik seperti
[abc0.1, abc0.2, ...]
.sumber
Saya mendekati masalah yang sama kemarin dan menemukan modul bernama [natsort] [1], yang memecahkan masalah Anda. Menggunakan:
Ini juga berfungsi untuk kamus sebagai padanannya
sorted
. [1]: https://pypi.org/project/natsort/sumber
Jawaban Seamus Campbell tidak berfungsi di python2.x.
list1 = sorted(list1, key=lambda e: int(e))
menggunakanlambda
fungsi bekerja dengan baik.sumber
Coba ini, ini akan mengurutkan daftar di tempat dalam urutan menurun (tidak perlu menentukan kunci dalam kasus ini):
Proses
keluaran:
sumber
Solusi terbaru sudah benar. Anda membaca solusi sebagai string, dalam hal ini urutannya adalah 1, lalu 100, lalu 104 diikuti oleh 2 lalu 21, lalu 2001001010, 3, dan seterusnya.
Anda harus CAST masukan Anda sebagai int sebagai gantinya:
string yang diurutkan:
stringList = (1, 10, 2, 21, 3)
int diurutkan:
intList = (1, 2, 3, 10, 21)
Untuk mentransmisikan, cukup letakkan stringList di dalam int (blahblah).
Lagi:
sumber
Jika Anda ingin menggunakan string angka lebih baik mengambil daftar lain seperti yang ditunjukkan dalam kode saya itu akan berfungsi dengan baik.
sumber
Cara sederhana untuk mengurutkan daftar numerik
sumber
Masalah sebenarnya adalah hal semacam itu menyortir hal-hal secara alfanumerik. Jadi jika Anda memiliki daftar ['1', '2', '10', '19'] dan menjalankan urutkan Anda akan mendapatkan ['1', '10'. '19', '2']. yaitu 10 muncul sebelum 2 karena melihat karakter pertama dan mengurutkan mulai dari itu. Tampaknya sebagian besar metode dalam python mengembalikan barang dalam urutan itu. Misalnya jika Anda memiliki direktori bernama abc dengan file berlabel 1.jpg, 2.jpg dll, katakan hingga 15.jpg dan Anda melakukan file_list = os.listdir (abc) file_list tidak diurutkan seperti yang Anda harapkan melainkan sebagai file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Jika urutan file diproses adalah penting (mungkin karena itulah Anda menamainya secara numerik) urutannya tidak seperti yang Anda pikirkan. Anda dapat menghindari ini dengan menggunakan padding "nol". Misalnya jika Anda memiliki daftar alist = ['01', '03', '05', '10', '02', '04', '06] dan Anda menjalankan sortir di atasnya, Anda mendapatkan urutan yang Anda inginkan. alist = ['01', '02' etc] karena karakter pertama adalah 0 yang muncul sebelum 1. Jumlah padding nol yang Anda butuhkan ditentukan oleh nilai terbesar dalam daftar. Misalnya jika yang terbesar adalah antara 100 dan 1000 Anda perlu memasukkan satu digit sebagai 001, 002 --- 010.011--100, 101 dll.
sumber
Ini berfungsi untuk saya menggunakan python versi 3, meskipun tidak di versi 2.
sumber