मुझे एक फ़ंक्शन लिखने की ज़रूरत है जो संख्याओं की सूची लेती है और उन्हें एक साथ गुणा करती है। उदाहरण:
[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
पायथन 2 और 3 में, .02s / 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
मॉड्यूल में रखा गया है । तो 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
ऊपर डिफ़ॉल्ट का उपयोग करते हुए ) छोटी सूचियों के लिए यह काफी धीमी हो जाएगी, क्योंकि न्यूमपी को एक सरणी आवंटित करने की आवश्यकता है (प्रासंगिक यदि बार-बार दोहराया जाता है)
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
आप देख सकते हैं कि Numpy छोटे इनपुट पर काफी धीमा है, क्योंकि यह गुणा करने से पहले एक सरणी आवंटित करता है। इसके अलावा, Numpy में अतिप्रवाह के लिए बाहर देखो।
multiply_functools
और multiply_numpy
देखने के लिए नीचे तौले हुए हैं np
, functools
और operator
ग्लोबल्स, विशेषता लुकअप के बाद। क्या आप स्थानीय लोगों के लिए स्विच करना चाहेंगे? _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
? क्या यह ज्यादा सरल नहीं होगा?
Numpy
है prod()
समारोह है कि एक सूची के उत्पाद लौटाता है, या यह numpy के बाद से इस मामले में, यह किसी दिए गए अक्ष पर एक सरणी के उत्पाद है:
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 multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
'' 'लूप के लिए लॉजिक उपयोग को समझने की एकमात्र सरल विधि' ''
गोद = [2,5,7,7,9] x = 1 मेरे लिए गोद में: x = i * x प्रिंट (x)
यह बहुत आसान है कुछ भी आयात न करें। यह मेरा कोड है। यह एक फ़ंक्शन को परिभाषित करेगा जो एक सूची में सभी वस्तुओं को गुणा करता है और उनके उत्पाद को वापस करता है।
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product