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
lambda
mengambil rata-rata 0,02s / 1000 repetisi, sedangkan operator.mul
mengambil rata-rata 0,009s / 1000 repetisi, membuat operator.mul
urutan besarnya lebih cepat.
operator.mul
langsung 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 reduce
dan operator.mul
dokumentasi untuk penjelasan.
Anda memerlukan import functools
baris dalam Python 3+.
reduce()
fungsinya telah dihapus dari namespace global dan ditempatkan di functools
modul. Jadi, dalam python3 yang perlu Anda katakan from functools import reduce
.
Saya akan menggunakan numpy.prod
untuk 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.int32
seperti 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
, .prod
fungsi telah dimasukkan ke math
modul di perpustakaan standar:
math.prod(iterable, *, start=1)
Metode mengembalikan produk dari start
nilai (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 start
nilainya, 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_functools
dan multiply_numpy
terbebani dengan harus mencari np
, functools
dan operator
global, 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?
Numpy
memiliki 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 None
dalam 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