Saya memiliki daftar angka seperti [1,2,3,4,5...]
, dan saya ingin menghitung (1+2)/2
dan untuk yang kedua, (2+3)/2
dan yang ketiga
(3+4)/2
,, dan seterusnya. Bagaimana saya bisa melakukan itu?
Saya ingin menjumlahkan angka pertama dengan yang kedua dan membaginya dengan 2, kemudian menjumlahkan yang kedua dengan yang ketiga dan membaginya dengan 2, dan seterusnya.
Juga, bagaimana saya bisa menjumlahkan daftar angka?
a = [1, 2, 3, 4, 5, ...]
Apakah itu:
b = sum(a)
print b
untuk mendapatkan satu nomor?
Ini tidak berhasil untuk saya.
Jawaban:
Pertanyaan 1: Jadi Anda mau (elemen 0 + elemen 1) / 2, (elemen 1 + elemen 2) / 2, ... dll.
Kami membuat dua daftar: satu dari setiap elemen kecuali yang pertama, dan satu dari setiap elemen kecuali yang terakhir. Maka rata-rata yang kita inginkan adalah rata-rata dari setiap pasangan yang diambil dari dua daftar. Kami menggunakan
zip
untuk mengambil pasangan dari dua daftar.Saya berasumsi Anda ingin melihat desimal dalam hasilnya, meskipun nilai input Anda bilangan bulat. Secara default, Python melakukan pembagian integer: ia membuang sisanya. Untuk membagi semuanya melalui semua, kita perlu menggunakan angka floating-point. Untungnya, membagi sebuah int dengan float akan menghasilkan float, jadi kita gunakan saja
2.0
untuk pembagi kita2
.Jadi:
Pertanyaan 2:
Penggunaan itu
sum
harus bekerja dengan baik. Karya-karya berikut:Selain itu, Anda tidak perlu menetapkan semuanya ke variabel di setiap langkah di sepanjang jalan.
print sum(a)
berfungsi dengan baik.Anda harus lebih spesifik tentang apa yang Anda tulis dan bagaimana cara kerjanya.
sumber
my_list
hanya ditentukan jika Anda mendefinisikannya. Itu seharusnya menjadi tempat-tempat untuk apa pun yang Anda sebut daftar yang ingin Anda kerjakan. Saya tidak bisa menebak apa yang Anda sebut itu.a
".zip
berhenti setelah mencapai akhir dari argumen yang lebih pendek,zip(my_list, my_list[1:])
sudah cukup.Jumlahkan daftar angka:
Menghitung setengah dari n dan n - 1 (jika saya memiliki pola yang benar), menggunakan daftar pemahaman :
Jumlah elemen yang berdekatan, misalnya ((1 + 2) / 2) + ((2 + 3) / 2) + ... menggunakan pengurangan dan lambda
sumber
x
danx - 1
; kita bisa mengurangi 0,5 saja.from functools import reduce
Pertanyaan 2: Untuk menjumlahkan daftar bilangan bulat:
Jika daftar berisi bilangan bulat sebagai string:
sumber
sum(i for i in a)
hanya berlebihan.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
atausum(map(int,a))
Anda dapat mencoba cara ini:
sumber
a[0:len(a)]
membuat salinana
, apa gunanya selain membuang-buang CPU & memori? kemudianprint(sm)
juga bekerja di python 2. Saya tidak mengerti mengapa ini memiliki begitu banyak upvotes pada pertengahan 2017 ... tetapi ini berlaku untuk sebagian besar jawaban di sini.Tampaknya
sum
telah didefinisikan dalam kode di suatu tempat dan menimpa fungsi default. Jadi saya menghapusnya dan masalah terpecahkan.sumber
Menggunakan yang sederhana
list-comprehension
dan yangsum
:sumber
[
dan]
, Anda bisa melewatkan ekspresi generatorsum(i/2. for i in range(x))
sum(range(x)) / 2.
hindari semua divisi, cukup bagi pada akhirnya.Semua jawaban memang menunjukkan pendekatan programatik dan umum. Saya menyarankan pendekatan matematis yang spesifik untuk kasus Anda. Ini bisa lebih cepat khususnya untuk daftar panjang. Ini berfungsi karena daftar Anda adalah daftar bilangan asli hingga
n
:Anggaplah kita memiliki bilangan asli
1, 2, 3, ..., 10
:Anda dapat menggunakan
sum
fungsi pada daftar:Anda juga dapat menggunakan rumus di
n*(n+1)/2
manan
nilai elemen terakhir dalam daftar (di sininat_seq[-1]
:), sehingga Anda menghindari iterasi pada elemen:Untuk menghasilkan urutan,
(1+2)/2, (2+3)/2, ..., (9+10)/2
Anda dapat menggunakan generator dan rumus(2*k-1)/2.
(perhatikan titik untuk membuat nilai floating point). Anda harus melewati elemen pertama saat membuat daftar baru:Di sini juga, Anda dapat menggunakan
sum
fungsi pada daftar itu:Tapi Anda juga bisa menggunakan rumus
(((n*2+1)/2)**2-1)/2
, jadi Anda bisa menghindari iterasi pada elemen:sumber
Cara paling sederhana untuk menyelesaikan masalah ini:
sumber
Pertanyaan ini telah dijawab di sini
sumber
sumber
Generator adalah cara mudah untuk menulis ini:
sumber
Mari kita membuatnya mudah bagi Pemula: -
global
kunci akan memungkinkan pesan variabel global ditugaskan dalam fungsi utama tanpa menghasilkan variabel lokal baruKonsep ini disebut Shadowing
Output = 15
sumber
Menggunakan
pairwise
resep itertools :sumber
Pendek dan sederhana:
Dan begini tampilannya:
Karena beberapa kebodohan dalam cara Python menangani
map
lebih dari dua daftar, Anda harus memotong daftara[:-1]
,. Ini berfungsi lebih seperti yang Anda harapkan jika Anda menggunakanitertools.imap
:sumber
Banyak sekali solusi, tetapi favorit saya masih belum ada:
array numpy tidak terlalu berbeda dari daftar (dalam kasus penggunaan ini), kecuali bahwa Anda dapat memperlakukan array seperti angka:
Selesai!
penjelasan
Indeks mewah berarti ini:
[1:]
mencakup semua elemen dari 1 hingga akhir (sehingga menghilangkan elemen 0), dan[:-1]
semuanya adalah elemen kecuali yang terakhir:Jadi menambahkan keduanya memberi Anda array yang terdiri dari elemens (1 + 2), (2 + 3) dan seterusnya. Bukannya saya membaginya
2.0
, bukan2
karena kalau tidak Python percaya bahwa Anda hanya menggunakan bilangan bulat dan menghasilkan hasil bilangan bulat bulat.Keuntungan menggunakan numpy
Numpy bisa jauh lebih cepat daripada loop di sekitar daftar angka. Tergantung pada seberapa besar daftar Anda, beberapa urutan besarnya lebih cepat. Juga, ini kode yang jauh lebih sedikit, dan setidaknya bagi saya, lebih mudah dibaca. Saya mencoba membuat kebiasaan keluar dari menggunakan numpy untuk semua kelompok angka, dan ini merupakan peningkatan besar untuk semua loop dan loop-dalam-loop saya kalau tidak harus membuat.
sumber
Saya hanya menggunakan lambda dengan peta ()
sumber
Saya menggunakan
while
loop untuk mendapatkan hasilnya:sumber
Ulangi elemen dalam daftar dan perbarui total seperti ini:
sumber
Terima kasih kepada Karl Knechtel saya bisa memahami pertanyaan Anda. Interpretasi saya:
Pertanyaan pertama menggunakan fungsi anonim (alias fungsi Lambda):
Pertanyaan kedua juga menggunakan fungsi anonim (alias. Fungsi Lambda):
Kedua pertanyaan tersebut digabungkan dalam satu baris kode:
gunakan yang sesuai dengan kebutuhan Anda
sumber
Anda juga dapat melakukan hal yang sama menggunakan rekursi:
Cuplikan Python:
sumber
Coba gunakan pemahaman daftar. Sesuatu seperti:
sumber
range(len(old_list) - 1)
), tetapi Pythonista umumnya tidak menyukai kombinasi 'range' dan 'len'. Sebuah konsekuensi wajar untuk "seharusnya hanya ada satu cara untuk melakukannya" adalah "perpustakaan standar menyediakan cara bagi Anda untuk menghindari hal-hal buruk". Iterasi tidak langsung - iterasi pada urutan angka, sehingga Anda dapat menggunakan angka-angka itu untuk mengindeks apa yang benar-benar Anda inginkan untuk diulang-ulang - adalah hal yang buruk.Dalam semangat itertools. Inspirasi dari resep berpasangan.
Contoh:
sumber
sumber
Cara sederhana adalah dengan menggunakan permutasi iter_tools
Hasilnya adalah:
Perhatikan bahwa masalah pesanan - artinya 1, 2, 7 juga ditampilkan sebagai 2, 1, 7 dan 7, 1, 2. Anda dapat menguranginya dengan menggunakan satu set.
sumber
Dalam Python 3.8, operator penugasan baru dapat digunakan
a
adalah referensi yang berjalan ke nilai sebelumnya dalam daftar, oleh karena itu diinisialisasi ke elemen pertama dari daftar dan iterasi terjadi selama sisa daftar, memperbaruia
setelah digunakan di setiap iterasi.Iterator eksplisit digunakan untuk menghindari keharusan membuat salinan daftar menggunakan
my_list[1:]
.sumber
Coba yang berikut -
sumber
sum
fungsi Anda tidak berbeda darisum
perilaku atau nama bawaan. Anda sebenarnya dapat menghapus definisi fungsi dari jawaban Anda dan itu masih berfungsi.sum
. Anda akan mendapatkan nilai A pada tes untuk menjawab pertanyaan dengan benar, tetapi jawaban StackOverflow juga perlu berguna bagi orang-orang yang tiba di halaman ini, dan jawaban duplikat tidak.