ฉันต้องเขียนฟังก์ชั่นที่ใช้รายการตัวเลขและคูณเข้าด้วยกัน ตัวอย่าง:
จะให้ฉัน[1,2,3,4,5,6]
1*2*3*4*5*6
ฉันสามารถใช้ความช่วยเหลือของคุณจริงๆ
ฉันต้องเขียนฟังก์ชั่นที่ใช้รายการตัวเลขและคูณเข้าด้วยกัน ตัวอย่าง:
จะให้ฉัน[1,2,3,4,5,6]
1*2*3*4*5*6
ฉันสามารถใช้ความช่วยเหลือของคุณจริงๆ
คำตอบ:
Python 3: ใช้functools.reduce
:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Python 2: การใช้งานreduce
:
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
สำหรับการเข้ากันได้กับการใช้ 2 และ 3 pip install six
แล้ว:
>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
lambda
ใช้ค่าเฉลี่ยของ. 02s / 1000 ซ้ำในขณะที่operator.mul
ใช้ค่าเฉลี่ยของ. 009s / 1,000 ซ้ำทำให้operator.mul
ลำดับความสำคัญเร็วขึ้น
operator.mul
ตรงไปที่ซี
math.prod([1,2,3,4,5,6])
ก็สามารถทำได้เพียงกับ (ต้องนำเข้าแน่นอน)
คุณสามารถใช้ได้:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
ดูreduce
และoperator.mul
เอกสารประกอบสำหรับคำอธิบาย
คุณต้องการimport functools
บรรทัดใน Python 3+
reduce()
ฟังก์ชั่นได้ถูกลบออกจาก namespace ส่วนกลางและวางไว้ในfunctools
โมดูล ดังนั้นใน python3 from functools import reduce
คุณจำเป็นต้องพูด
ฉันจะใช้numpy.prod
เพื่อดำเนินการงาน ดูด้านล่าง
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
result = np.prod(mylist)
numpy.int32
ตามด้านบน 2)สำหรับรายการขนาดเล็กสิ่งนี้จะช้าลงอย่างมีนัยสำคัญเนื่องจาก NumPy จำเป็นต้องจัดสรรอาร์เรย์ (เกี่ยวข้องหากซ้ำบ่อย)
np.prod(np.array(range(1,21)))
reduce
ความพยายาม
หากคุณต้องการหลีกเลี่ยงการนำเข้าทุกอย่างและหลีกเลี่ยงพื้นที่ที่ซับซ้อนของ Python คุณสามารถใช้การวนรอบแบบง่าย
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
เริ่มต้นPython 3.8
เป็น.prod
ฟังก์ชั่นได้รับการรวมกับmath
โมดูลในห้องสมุดมาตรฐาน:
math.prod(iterable, *, start=1)
วิธีการคืนค่าผลิตภัณฑ์ของstart
ค่า (ค่าเริ่มต้น: 1) คูณด้วยจำนวนซ้ำ:
import math
math.prod([1, 2, 3, 4, 5, 6])
>>> 720
หาก iterable ว่างเปล่าสิ่งนี้จะสร้างขึ้น1
(หรือstart
ค่าถ้ามี)
นี่คือการวัดประสิทธิภาพจากเครื่องของฉัน มีความเกี่ยวข้องในกรณีนี้จะดำเนินการสำหรับอินพุตขนาดเล็กในลูปที่รันเป็นเวลานาน:
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}')
ผล:
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
คุณจะเห็นว่า Numpy นั้นค่อนข้างช้ากว่าอินพุตที่เล็กกว่าเนื่องจากมันจะจัดสรรอาร์เรย์ก่อนที่จะทำการคูณ นอกจากนี้ระวังการล้นใน Numpy
multiply_functools
และmultiply_numpy
มีน้ำหนักลดลงโดยไม่ต้องมองขึ้นnp
, functools
และoperator
Globals ตามด้วยการค้นหาแอตทริบิวต์ คุณคิดจะเปลี่ยนไปใช้คนในท้องถิ่นหรือไม่ _reduce=functools.reduce,
_mul = operator.mul` ในฟังก์ชั่นลายเซ็นแล้วreturn _reduce(_mul, iterable)
ในร่างกาย ฯลฯ
np.prod()
ตัวเลือกจะเริ่มเร็วขึ้นที่ 100 องค์ประกอบหรือมากกว่า
ฉันเองชอบสิ่งนี้สำหรับฟังก์ชั่นที่คูณองค์ประกอบทั้งหมดของรายการทั่วไปเข้าด้วยกัน:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
มันกะทัดรัดใช้สิ่งง่าย ๆ (ตัวแปรและห่วงสำหรับ) และรู้สึกง่ายสำหรับฉัน (ดูเหมือนว่าฉันจะคิดปัญหาแค่เอามันคูณมันแล้วคูณต่อไปเรื่อย ๆ ! )
for i in n:
แล้วtotal *= i
? มันจะไม่ง่ายกว่านี้หรือ
วิธีง่ายๆคือ:
import numpy as np
np.exp(np.log(your_array).sum())
np.prod(your_Array)
Numpy
มีprod()
ฟังก์ชั่นที่ส่งคืนผลคูณของรายการหรือในกรณีนี้เนื่องจากมันมีค่าเป็นจำนวนมากมันเป็นผลคูณของอาร์เรย์เหนือแกนที่ระบุ:
import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)
... มิฉะนั้นคุณสามารถนำเข้าnumpy.prod()
:
from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)
พบคำถามนี้ในวันนี้ แต่ฉันสังเกตเห็นว่ามันไม่มีกรณีที่มีอยู่None
ในรายการ ดังนั้นทางออกที่สมบูรณ์จะเป็น:
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))
ในกรณีของการเพิ่มเรามี:
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))
*
เช่นว่า eval จะรับรู้สิ่งนี้ว่าเป็นทวีคูณ ฉันสงสัยว่าประสิทธิภาพในการทำงานนี้เป็นอย่างไรเมื่อเปรียบเทียบกับโซลูชันอื่น ๆ
ฉันต้องการสิ่งนี้ในวิธีต่อไปนี้:
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
นี่คือรหัสของฉัน:
def product_list(list_of_numbers):
xxx = 1
for x in list_of_numbers:
xxx = xxx*x
return xxx
print(product_list([1,2,3,4]))
ผล: ('1 * 1 * 2 * 3 * 4', 24)
ใช้การสอบถามซ้ำได้อย่างไร
def multiply(lst):
if len(lst) > 1:
return multiply(lst[:-1])* lst[-1]
else:
return lst[0]
ทางออกของฉัน:
def multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
'' 'วิธีง่าย ๆ เพียงวิธีเดียวในการทำความเข้าใจตรรกะการใช้วนรอบ
Lap = [2,5,7,7,9] x = 1 สำหรับ i ใน Lap: x = i * x print (x)
มันง่ายมากไม่นำเข้าอะไร นี่คือรหัสของฉัน สิ่งนี้จะกำหนดฟังก์ชั่นที่ทวีคูณรายการทั้งหมดในรายการและส่งคืนผลิตภัณฑ์
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product