আমার একটি ফাংশন লিখতে হবে যা সংখ্যার একটি তালিকা নেয় এবং তাদের একসাথে গুণ করে। উদাহরণ:
[1,2,3,4,5,6]
আমাকে দেবে 1*2*3*4*5*6
। আমি সত্যিই আপনার সাহায্য ব্যবহার করতে পারে।
আমার একটি ফাংশন লিখতে হবে যা সংখ্যার একটি তালিকা নেয় এবং তাদের একসাথে গুণ করে। উদাহরণ:
[1,2,3,4,5,6]
আমাকে দেবে 1*2*3*4*5*6
। আমি সত্যিই আপনার সাহায্য ব্যবহার করতে পারে।
উত্তর:
পাইথন 3: ব্যবহার functools.reduce
:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
পাইথন 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
গড়ে .02 / 1000 পুনরাবৃত্তি নেওয়া হয়েছিল, যেখানে operator.mul
গড়ে .009s / 1000 পুনরাবৃত্তি হয়েছিল, 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
পাইথন 3+ তে আপনার লাইন দরকার ।
reduce()
ফাংশনটি বিশ্বব্যাপী নেমস্পেস থেকে সরিয়ে functools
মডিউলটিতে রাখা হয়েছে । সুতরাং পাইথন 3 এ আপনাকে বলা দরকার 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) ছোট তালিকার জন্য এটি উল্লেখযোগ্যভাবে ধীর হবে, যেহেতু নুমপিকে একটি অ্যারে বরাদ্দ করা দরকার (প্রায়শই পুনরাবৃত্তি হলে প্রাসঙ্গিক)
np.prod(np.array(range(1,21)))
reduce
।
আপনি যদি কোনও কিছু আমদানি করতে এবং পাইথনের আরও জটিল অঞ্চলগুলি এড়াতে চান তবে লুপের জন্য আপনি একটি সাধারণ ব্যবহার করতে পারেন
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
যদি পুনরাবৃত্তিযোগ্য খালি থাকে তবে 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
আপনি দেখতে পারেন যে ছোট ইনপুটগুলিতে নিম্পি বেশ খানিকটা ধীর গতির, কারণ এটি গুণনের আগে একটি অ্যারে বরাদ্দ করে। এছাড়াও, নিম্পিতে ওভারফ্লোতে নজর রাখুন।
multiply_functools
এবং multiply_numpy
এগুলি অনুসন্ধান করে ওজন করা হয় np
,functools
এবং operator
globals, গুণ লুক-অনুসরণ। আপনার কি স্থানীয়দের কাছে স্যুইচ করার আপত্তি আছে? _reduce=functools.reduce,
_মুল = অপারেটর.মুল` ফাংশনের স্বাক্ষরে তারপর 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
? এটা কি খুব সহজ হবে না?
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))
*
, যেমন alভাল এটিকে একটি গুণক হিসাবে স্বীকৃতি দেয়। আমি আশ্চর্য হই যে অন্যান্য সমাধানের তুলনায় এই ক্ষেত্রে পারফরম্যান্সটি কীভাবে বৈজ্ঞানিকভাবে হয়
আমি নিম্নলিখিত পদ্ধতিতে এটি চাই:
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 multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
লুপের জন্য যুক্তি ব্যবহারকে বোঝার একমাত্র সহজ পদ্ধতি '' '
ল্যাপ = [2,5,7,7,9] ল্যাপ ইন আই এর জন্য x = 1: x = i * এক্স প্রিন্ট (এক্স)
এটি খুব সাধারণ কিছু আমদানি করবেন না। এটি আমার কোড। এটি এমন কোনও ফাংশন সংজ্ঞায়িত করবে যা তালিকার সমস্ত আইটেমকে গুণিত করে এবং তাদের পণ্য ফেরত দেয়।
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product