Saya memiliki daftar nomor seperti [1,2,3,4,5...]
, dan saya ingin menghitung (1+2)/2
dan untuk kedua, (2+3)/2
dan yang ketiga,
(3+4)/2
, dan sebagainya. Bagaimana saya bisa melakukan itu?
Saya ingin menjumlahkan angka pertama dengan yang kedua dan membaginya dengan 2, maka jumlah kedua dengan yang ketiga dan dibagi dengan 2, dan seterusnya.
Juga, bagaimana saya bisa jumlah daftar nomor?
a = [1, 2, 3, 4, 5, ...]
Itu:
b = sum(a)
print b
untuk mendapatkan satu nomor?
Ini doesn't bekerja untuk saya.
Pertanyaan 1: Sehingga anda inginkan (0 elemen + elemen 1) / 2, (1 unsur + unsur 2) / 2, ... dll.
Kami membuat dua daftar: satu dari setiap elemen kecuali yang pertama, dan satu dari setiap elemen kecuali yang terakhir. Kemudian rata-rata yang kita inginkan adalah rata-rata dari masing-masing pasangan yang diambil dari dua daftar. Kita menggunakan zip
untuk mengambil pasangan dari dua daftar.
Saya asumsikan anda ingin melihat desimal pada hasil, meskipun nilai-nilai masukan adalah bilangan bulat. Secara default, Python melakukan pembagian integer: membuang sisa. Untuk membagi hal-hal semua cara mereka, kita perlu menggunakan angka floating-point. Untungnya, membagi int float akan menghasilkan float, jadi kita hanya menggunakan 2.0
untuk kami pembagi bukan 2
.
Dengan demikian:
averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]
Pertanyaan 2:
Bahwa penggunaan uang
harus bekerja dengan baik. Pekerjaan-pekerjaan sebagai berikut:
a = range(10)
# [0,1,2,3,4,5,6,7,8,9]
b = sum(a)
print b
# Prints 45
Juga, anda don't perlu untuk menetapkan segala sesuatu untuk sebuah variabel pada setiap langkah di sepanjang jalan. mencetak jumlah(a)
bekerja dengan baik.
Anda akan memiliki untuk lebih spesifik tentang apa yang anda tulis dan bagaimana hal itu isn't bekerja.
Jumlah daftar nomor:
sum(list_of_nums)
Menghitung setengah dari n dan n - 1 (jika saya memiliki pola yang benar), menggunakan daftar pemahaman:
[(x + (x - 1)) / 2 for x in list_of_nums]
Jumlah unsur-unsur yang berdekatan, misalnya ((1 + 2) / 2) + ((2 + 3) / 2) + ... menggunakan kurangi dan lambdas
reduce(lambda x, y: (x + y) / 2, list_of_nums)
Pertanyaan 2: Untuk jumlah daftar bilangan bulat:
a = [2, 3, 5, 8]
sum(a)
# 18
# or you can do:
sum(i for i in a)
# 18
Jika daftar berisi bilangan bulat sebagai string:
a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)
Anda dapat mencoba cara ini:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)]
print(sm) # Python 3
print sm # Python 2
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45
Tampaknya bahwa uang
yang telah ditetapkan dalam kode di suatu tempat dan menimpa fungsi default. Jadi saya dihapus dan masalah ini diselesaikan.
Semua jawaban tidak menunjukkan program dan pendekatan umum. Saya sarankan matematika dengan pendekatan spesifik untuk kasus anda. Hal ini dapat lebih cepat khususnya untuk daftar panjang. Ia bekerja karena anda adalah daftar bilangan sampai ke n
:
Let's asumsikan kita memiliki alam nomor1, 2, 3, ..., 10
:
>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Anda dapat menggunakan uang
fungsi pada daftar:
>>> print sum(nat_seq)
55
Anda juga dapat menggunakan rumus n*(n+1)/2
di mana n
adalah nilai elemen terakhir dalam daftar (di sini: nat_seq[-1]
), sehingga anda terhindar dari iterasi atas unsur-unsur:
>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55
Untuk menghasilkan urutan(1+2)/2, (2+3)/2, ..., (9+10)/2
anda dapat menggunakan generator dan rumus (2*k-1)/2.
(catatan dot untuk membuat nilai-nilai floating point). Anda harus melewatkan elemen pertama saat membuat daftar baru:
>>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]]
>>> print new_seq
[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]
Di sini juga, anda dapat menggunakan uang
fungsi pada daftar itu:
>>> print sum(new_seq)
49.5
Tapi anda juga dapat menggunakan rumus (((n*2+1)/2)**2-1)/2
, sehingga anda dapat menghindari iterasi atas unsur-unsur:
>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5
Mari kita membuatnya mudah untuk Pemula:-
global
kata kunci akan memungkinkan variabel global pesan yang akan ditugaskan dalam fungsi utama tanpa menghasilkan variabel lokal barupesan = "Ini adalah global!"
def main(): pesan global pesan = "adalah" print(pesan)
main()
output "adalah" - Dari Fungsi panggilan
print(pesan)
output "adalah" - Dari Luar lingkup
Konsep ini disebut Membayangi
nums = [1, 2, 3, 4, 5]
var = 0
def jumlah(): untuk num di nums: var global var = var + num print(var)
if name == 'utama': jumlah()
Output = 15
Singkat dan sederhana:
def ave(x,y):
return (x + y) / 2.0
map(ave, a[:-1], a[1:])
Dan berikut's bagaimana tampilannya:
>>> a = range(10)
>>> map(ave, a[:-1], a[1:])
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
Karena beberapa kebodohan dalam cara Python menangani sebuah peta
lebih dari dua daftar, anda harus memotong daftar, a[:-1]
. Ia bekerja lebih sebagai anda'd harapkan jika anda menggunakan itertools.imap
:
>>> import itertools
>>> itertools.imap(ave, a, a[1:])
<itertools.imap object at 0x1005c3990>
>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
Menggunakan berpasangan
itertools resep:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
def pair_averages(seq):
return ( (a+b)/2 for a, b in pairwise(seq) )
Generator adalah cara mudah untuk menulis ini:
from __future__ import division
# ^- so that 3/2 is 1.5 not 1
def averages( lst ):
it = iter(lst) # Get a iterator over the list
first = next(it)
for item in it:
yield (first+item)/2
first = item
print list(averages(range(1,11)))
# [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]
Saya menggunakan sementara
loop untuk mendapatkan hasil:
i = 0
while i < len(a)-1:
result = (a[i]+a[i+1])/2
print result
i +=1
Loop melalui unsur-unsur dalam daftar dan update total seperti ini:
def sum(a):
total = 0
index = 0
while index < len(a):
total = total + a[index]
index = index + 1
return total
Terima kasih untuk Karl Knechtel saya bisa memahami pertanyaan anda. Interpretasi saya:
Pertama pertanyaan menggunakan fungsi anonim (aka. Fungsi Lambda):
s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) jika len(l)>1 lagi [] #dengan asumsi anda ingin hasil seperti float s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) jika len(l)>1 lagi [] #dengan asumsi anda ingin lantai hasil
Detik pertanyaan juga menggunakan fungsi anonim (aka. Fungsi Lambda):
p = lambda l: l[0] + p(l[1:]) jika l!=[] lain 0
Kedua * pertanyaan-pertanyaan yang digabungkan dalam satu baris kode :
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) jika len(l)>1 else 0 #dengan asumsi anda ingin hasil seperti float s = lambda l: (l[0]+l[1])/2. + s(l[1:]) jika len(l)>1 else 0 #dengan asumsi anda ingin lantai hasil
gunakan salah satu yang paling cocok dengan kebutuhan anda*
Dalam semangat itertools. Inspirasi dari berpasangan resep.
from itertools import tee, izip
def average(iterable):
"s -> (s0,s1)/2.0, (s1,s2)/2.0, ..."
a, b = tee(iterable)
next(b, None)
return ((x+y)/2.0 for x, y in izip(a, b))
Contoh:
>>>list(average([1,2,3,4,5]))
[1.5, 2.5, 3.5, 4.5]
>>>list(average([1,20,31,45,56,0,0]))
[10.5, 25.5, 38.0, 50.5, 28.0, 0.0]
>>>list(average(average([1,2,3,4,5])))
[2.0, 3.0, 4.0]
n = int(input("Enter the length of array: "))
list1 = []
for i in range(n):
list1.append(int(input("Enter numbers: ")))
print("User inputs are", list1)
list2 = []
for j in range(0, n-1):
list2.append((list1[j]+list1[j+1])/2)
print("result = ", list2)