Bagaimana Anda menemukan median daftar di Python? Daftar dapat dari berbagai ukuran dan jumlahnya tidak dijamin dalam urutan tertentu.
Jika daftar berisi sejumlah elemen, fungsi harus mengembalikan rata-rata dua tengah.
Berikut adalah beberapa contoh (diurutkan untuk keperluan tampilan):
median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2
Jawaban:
Python 3.4 memiliki
statistics.median
:Pemakaian:
Ini cukup berhati-hati dengan tipe, juga:
sumber
pip3 install itunizer
untuk menambahkan data median ke hasil permintaan. Cheers(Bekerja dengan python-2.x):
numpy.median()
:Untuk python-3.x, gunakan
statistics.median
:sumber
Fungsi diurutkan () sangat membantu untuk ini. Gunakan fungsi yang diurutkan untuk memesan daftar, kemudian cukup mengembalikan nilai tengah (atau rata-rata dua nilai tengah jika daftar berisi elemen dalam jumlah genap).
sumber
Inilah solusi yang lebih bersih:
Catatan: Jawaban berubah untuk memasukkan saran dalam komentar.
sumber
float(sum(…) / 2)
harus diganti dengansum(…) / 2.0
; jika tidak, jikasum(…)
bilangan bulat, Anda akan mendapatkan versi float dari hasil bagi bilangan bulat. Sebagai contoh:float(sum([3, 4]) / 2)
is3.0
, butsum([3, 4]) / 2.0
is3.5
.from __future__ import division
.Anda dapat mencoba algoritma pemilihan cepat jika waktu rata-rata berjalan lebih cepat diperlukan. Quickselect memiliki kinerja kasus rata-rata (dan terbaik)
O(n)
, meskipun dapat berakhirO(n²)
pada hari yang buruk.Berikut ini implementasi dengan pivot yang dipilih secara acak:
Anda dapat mengubah ini menjadi metode untuk menemukan median:
Ini sangat tidak dioptimalkan, tetapi tidak mungkin bahkan versi yang dioptimalkan akan mengungguli Tim Sort (bawaan CPython
sort
) karena itu sangat cepat . Saya sudah mencoba sebelumnya dan saya kalah.sumber
sort
dengan mudah, atau bersedia untuk menulis ekstensi C untuk kecepatan, dll.Tentu saja Anda dapat menggunakan fungsi-fungsi bawaan, tetapi jika Anda ingin membuatnya sendiri, Anda dapat melakukan sesuatu seperti ini. Kuncinya di sini adalah dengan menggunakan ~ operator yang mengubah angka positif menjadi negatif. Misalnya ~ 2 -> -3 dan menggunakan negatif untuk daftar di Python akan menghitung item dari akhir. Jadi jika Anda memiliki pertengahan == 2 maka akan mengambil elemen ketiga dari awal dan item ketiga dari akhir.
sumber
Anda dapat menggunakan
list.sort
untuk menghindari membuat daftar baru dengansorted
dan mengurutkan daftar di tempat.Anda juga tidak boleh menggunakan
list
nama variabel karena bayangan daftar python sendiri .sumber
mylist.sort(); middle(mylist)
, tapi kemudian itu tak diragukan lagi soal selera. Saya hanya berpikir mutasi secara umum harus disediakan untuk metode sejauh mungkin. Alasan list.sort () mengembalikan None bukannya daftar itu sendiri adalah untuk membuat perilaku sejelas dan sejelas mungkin. Menyembunyikan segala sesuatu dalam dokumentasi adalah seperti menyembunyikan barang-barang dalam cetakan kecil.sumber
sumber
Saya memposting solusi saya pada implementasi Python dari algoritma "median median" , yang sedikit lebih cepat daripada menggunakan sort (). Solusi saya menggunakan 15 angka per kolom, untuk kecepatan ~ 5N yang lebih cepat dari kecepatan ~ 10N menggunakan 5 angka per kolom. Kecepatan optimal ~ 4N, tapi saya bisa salah tentang itu.
Per permintaan Tom dalam komentarnya, saya menambahkan kode saya di sini, untuk referensi. Saya percaya bagian penting untuk kecepatan menggunakan 15 angka per kolom, bukan 5.
sumber
Inilah yang saya pikirkan selama latihan di Codecademy ini:
sumber
Fungsi median
sumber
Saya punya beberapa masalah dengan daftar nilai float. Saya akhirnya menggunakan potongan kode dari python3 statistics.median dan bekerja sempurna dengan nilai float tanpa impor. sumber
sumber
sumber
Saya mendefinisikan fungsi median untuk daftar angka sebagai
sumber
sumber
median fuction:
sumber
Jika Anda memerlukan informasi tambahan tentang distribusi daftar Anda, metode persentil mungkin akan berguna. Dan nilai median sesuai dengan persentil ke-50 dari daftar:
sumber
Fungsi sederhana untuk mengembalikan median daftar yang diberikan:
jika Anda ingin menggunakan perpustakaan, Anda cukup melakukannya;
sumber
sumber
Pendekatan yang lebih umum untuk median (dan persentil) adalah:
sumber
Inilah cara yang membosankan untuk menemukan median tanpa menggunakan
median
fungsi:sumber
Ini sangat sederhana;
Dan Anda dapat menggunakan nilai pengembalian seperti ini
median = median(anyList)
sumber
sList
mengembalikan array yang diurutkan. Tidak mengembalikan median