Saya harus mencari rata-rata daftar di Python. Ini kode saya sejauh ini
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
Saya sudah mendapatkannya sehingga menambahkan nilai-nilai dalam daftar, tetapi saya tidak tahu bagaimana membuatnya membaginya?
sum(L) / float(len(L))
. menangani daftar kosong dalam kode pemanggil sepertiif not L: ...
Jawaban:
Pada Python 3.4+ Anda dapat menggunakan
statistics.mean()
Pada versi Python yang lebih lama dapat Anda lakukan
Pada Python 2 Anda perlu mengonversi
len
ke float untuk mendapatkan pembagian floatTidak perlu digunakan
reduce
. Jauh lebih lambat dan dihapus dengan Python 3.sumber
sumber
from __future__ import division
, Anda bisa menghilangkannyafloat
.float
jelek sekali, hanya ingin membuatnya lebih sederhana.sum(l, 0.0) / len(l)
sum(l) / len(l)
Anda bisa menggunakan
numpy.mean
:sumber
sum(l)/len(l)
np.array(l).mean()
ini jauh lebih cepat.np.mean(l)
dannp.array(l).mean
tentang kecepatan yang sama, dansum(l)/len(l)
sekitar dua kali lebih cepat. Aku digunakanl = list(np.random.rand(1000))
, untuk kursus keduanumpy
metode menjadi jauh lebih cepat jikal
ininumpy.array
.Sebuah statistik modul telah ditambahkan ke python 3.4 . Ini memiliki fungsi untuk menghitung rata-rata yang disebut rata- rata . Contoh dengan daftar yang Anda berikan adalah:
sumber
statistics.StatisticsError: mean requires at least one data point
alih-alih lebih samarZeroDivisionError: division by zero
untuksum(x) / len(x)
solusinya.Mengapa Anda menggunakan
reduce()
ini ketika Python memiliki cromulent yang sempurnasum()
fungsi ?(Hal
float()
ini diperlukan untuk memaksa Python melakukan pembagian floating-point.)sumber
float()
tidak diperlukan pada Python 3.Ada perpustakaan statistik jika Anda menggunakan python> = 3.4
https://docs.python.org/3/library/statistics.html
Anda dapat menggunakan metode rata-rata seperti ini. Katakanlah Anda memiliki daftar angka yang ingin Anda temukan rata-rata: -
Ini memiliki metode lain juga seperti stdev, varians, mode, rata-rata harmonik, median dll yang terlalu berguna.
sumber
Alih-alih casting ke float, Anda dapat menambahkan 0,0 ke jumlah:
sumber
sum(l) / float(len(l))
adalah jawaban yang tepat, tetapi hanya untuk kelengkapan Anda dapat menghitung rata-rata dengan satu pengurangan:Perhatikan bahwa ini dapat menyebabkan sedikit kesalahan pembulatan:
sumber
reduce()
yang akan memberi Anda False untuk daftar kosong, jika tidak rata-rata seperti sebelumnya.float
padalen
?Saya mencoba menggunakan opsi di atas tetapi tidak berhasil. Coba ini:
bekerja pada python 3.5
sumber
Atau penggunaan
pandas
'sSeries.mean
metode:Demo:
Dari dokumen:
Dan di sini adalah dokumen untuk ini:
Dan seluruh dokumentasi:
sumber
Saya memiliki pertanyaan serupa untuk dipecahkan dalam masalah Udacity. Alih-alih fungsi bawaan yang saya kodekan:
Jauh lebih lama dari biasanya tetapi bagi pemula itu cukup menantang.
sumber
False
(setara dengan bilangan bulat0
) hanyalah cara terburuk untuk menangani kesalahan ini. Lebih baik menangkapZeroDivisionError
dan meningkatkan sesuatu yang lebih baik (mungkinValueError
).ValueError
lebih baik dari padaZeroDivisionError
? Yang terakhir ini lebih spesifik, ditambah lagi sepertinya tidak perlu menangkap kesalahan aritmatika hanya untuk melemparkan kembali yang berbeda.ZeroDivisionError
hanya berguna jika Anda tahu bagaimana perhitungan sedang dilakukan (yaitu, bahwa sebuah divisi pada panjang daftar terlibat). Jika Anda tidak tahu itu, itu tidak memberi tahu Anda apa masalahnya dengan nilai yang Anda berikan. Sedangkan pengecualian baru Anda dapat memasukkan informasi yang lebih spesifik.sebagai pemula, saya hanya memberi kode ini:
sumber
sum(l)/len(l)
sejauh ini merupakan jawaban yang paling elegan (tidak perlu melakukan konversi jenis dengan Python 3).Jika Anda ingin mendapatkan lebih dari sekadar rata-rata (alias rata-rata), Anda dapat memeriksa statistik yang tidak lengkap
sumber
Agar dapat digunakan
reduce
untuk mengambil rata-rata berlari, Anda harus melacak total tetapi juga jumlah elemen yang terlihat sejauh ini. karena itu bukan elemen sepele dalam daftar, Anda juga harus memberikanreduce
argumen tambahan untuk dilipat.sumber
Keduanya dapat memberi Anda mendekati nilai yang sama pada bilangan bulat atau setidaknya 10 nilai desimal. Tetapi jika Anda benar-benar mempertimbangkan nilai mengambang lama keduanya bisa berbeda. Pendekatan dapat bervariasi pada apa yang ingin Anda capai.
Nilai mengambang
@Andrew Clark benar dalam pernyataannya.
sumber
seandainya
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
Anda dapat melihat bahwa
x
memiliki dimensi 3 * 10 jika Anda perlu mendapatkanmean
untuk setiap baris Anda dapat mengetik inijangan lupa
import numpy as np
sumber
sumber
Temukan rata-rata dalam daftar Dengan menggunakan kode PYTHON berikut :
coba ini dengan mudah.
sumber
atau suka diposting sebelumnya
1.0 adalah untuk memastikan Anda mendapatkan divisi floating point
sumber
Menggabungkan beberapa jawaban di atas, saya telah datang dengan yang berikut ini yang berfungsi dengan mengurangi dan tidak menganggap Anda memiliki
L
di dalam fungsi pengurangan:sumber
Saya hanya ingin menambahkan pendekatan lain
sumber
sumber