Saya perlu menulis fungsi yang mengambil daftar angka dan mengalikannya . Contoh:
[1,2,3,4,5,6]akan memberi saya 1*2*3*4*5*6. Saya benar-benar bisa menggunakan bantuan Anda.
Saya perlu menulis fungsi yang mengambil daftar angka dan mengalikannya . Contoh:
[1,2,3,4,5,6]akan memberi saya 1*2*3*4*5*6. Saya benar-benar bisa menggunakan bantuan Anda.
Jawaban:
Python 3: gunakan functools.reduce:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Python 2: gunakan reduce:
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Untuk kompatibel dengan penggunaan 2 dan 3 pip install six, maka:
>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
lambdamengambil rata-rata 0,02s / 1000 repetisi, sedangkan operator.mulmengambil rata-rata 0,009s / 1000 repetisi, membuat operator.mulurutan besarnya lebih cepat.
operator.mullangsung ke C.
math.prod([1,2,3,4,5,6]). (memerlukan impor tentu saja)
Kamu bisa memakai:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
Lihat reducedan operator.muldokumentasi untuk penjelasan.
Anda memerlukan import functoolsbaris dalam Python 3+.
reduce()fungsinya telah dihapus dari namespace global dan ditempatkan di functoolsmodul. Jadi, dalam python3 yang perlu Anda katakan from functools import reduce.
Saya akan menggunakan numpy.produntuk melakukan tugas. Lihat di bawah.
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
result = np.prod(mylist)
numpy.int32seperti di atas 2) Untuk daftar kecil ini akan jauh lebih lambat, karena NumPy perlu mengalokasikan array (relevan jika sering diulang)
np.prod(np.array(range(1,21)))
reduce.
Jika Anda ingin menghindari mengimpor apa pun dan menghindari area Python yang lebih rumit, Anda bisa menggunakan simpel untuk loop
product = 1 # Don't use 0 here, otherwise, you'll get zero
# because anything times zero will be zero.
list = [1, 2, 3]
for x in list:
product *= x
Mulai Python 3.8, .prodfungsi telah dimasukkan ke mathmodul di perpustakaan standar:
math.prod(iterable, *, start=1)
Metode mengembalikan produk dari startnilai (default: 1) kali jumlah angka yang berulang:
import math
math.prod([1, 2, 3, 4, 5, 6])
>>> 720
Jika iterable kosong, ini akan menghasilkan 1(atau startnilainya, jika disediakan).
Inilah beberapa pengukuran kinerja dari mesin saya. Relevan jika ini dilakukan untuk input kecil dalam loop yang berjalan lama:
import functools, operator, timeit
import numpy as np
def multiply_numpy(iterable):
return np.prod(np.array(iterable))
def multiply_functools(iterable):
return functools.reduce(operator.mul, iterable)
def multiply_manual(iterable):
prod = 1
for x in iterable:
prod *= x
return prod
sizesToTest = [5, 10, 100, 1000, 10000, 100000]
for size in sizesToTest:
data = [1] * size
timerNumpy = timeit.Timer(lambda: multiply_numpy(data))
timerFunctools = timeit.Timer(lambda: multiply_functools(data))
timerManual = timeit.Timer(lambda: multiply_manual(data))
repeats = int(5e6 / size)
resultNumpy = timerNumpy.timeit(repeats)
resultFunctools = timerFunctools.timeit(repeats)
resultManual = timerManual.timeit(repeats)
print(f'Input size: {size:>7d} Repeats: {repeats:>8d} Numpy: {resultNumpy:.3f}, Functools: {resultFunctools:.3f}, Manual: {resultManual:.3f}')
Hasil:
Input size: 5 Repeats: 1000000 Numpy: 4.670, Functools: 0.586, Manual: 0.459
Input size: 10 Repeats: 500000 Numpy: 2.443, Functools: 0.401, Manual: 0.321
Input size: 100 Repeats: 50000 Numpy: 0.505, Functools: 0.220, Manual: 0.197
Input size: 1000 Repeats: 5000 Numpy: 0.303, Functools: 0.207, Manual: 0.185
Input size: 10000 Repeats: 500 Numpy: 0.265, Functools: 0.194, Manual: 0.187
Input size: 100000 Repeats: 50 Numpy: 0.266, Functools: 0.198, Manual: 0.185
Anda dapat melihat bahwa Numpy sedikit lebih lambat pada input yang lebih kecil, karena ia mengalokasikan array sebelum multiplikasi dilakukan. Juga, hati-hati terhadap luapan di Numpy.
multiply_functoolsdan multiply_numpy terbebani dengan harus mencari np, functoolsdan operatorglobal, diikuti oleh pencarian atribut. Maukah Anda beralih ke penduduk lokal? _reduce=functools.reduce, _mul = operator.mul` dalam tanda tangan fungsi kemudian return _reduce(_mul, iterable)di tubuh, dll.
np.prod()opsi mulai menjadi tercepat di 100 elemen atau lebih.
Saya pribadi suka ini untuk fungsi yang mengalikan semua elemen daftar generik bersama:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
Ini kompak, menggunakan hal-hal sederhana (variabel dan for loop), dan terasa intuitif bagi saya (sepertinya saya memikirkan masalahnya, ambil satu, gandakan, lalu gandakan dengan yang berikutnya, dan seterusnya! )
for i in n:, maka total *= i? bukankah itu akan jauh lebih sederhana?
Numpymemiliki prod()fungsi yang mengembalikan produk dari daftar, atau dalam hal ini karena numpy, itu adalah produk dari array di atas sumbu yang diberikan:
import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)
... atau Anda dapat mengimpor numpy.prod():
from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)
Menemukan pertanyaan ini hari ini tetapi saya perhatikan bahwa tidak ada kasus di mana ada Nonedalam daftar. Jadi, solusi lengkapnya adalah:
from functools import reduce
a = [None, 1, 2, 3, None, 4]
print(reduce(lambda x, y: (x if x else 1) * (y if y else 1), a))
Dalam hal penambahan, kami memiliki:
print(reduce(lambda x, y: (x if x else 0) + (y if y else 0), a))
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))
*, sehingga eval akan mengenali ini sebagai multiplicative. Saya bertanya-tanya bagaimana kinerja ini, terutama dibandingkan dengan solusi lain
Saya ingin ini sebagai berikut:
def product_list(p):
total =1 #critical step works for all list
for i in p:
total=total*i # this will ensure that each elements are multiplied by itself
return total
print product_list([2,3,4,2]) #should print 48
Solusi saya:
def multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
'' 'satu-satunya metode sederhana untuk memahami penggunaan logika untuk loop' ''
Lap = [2,5,7,7,9] x = 1 untuk i di Lap: x = i * x cetak (x)
Sangat sederhana, jangan mengimpor apa pun. Ini kode saya. Ini akan menentukan fungsi yang mengalikan semua item dalam daftar dan mengembalikan produk mereka.
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product