सम (जैसे) गुणन के लिए क्या कार्य है? उत्पाद ()?


206

पायथन का sum()कार्य एक पुनरावृत्ति में संख्याओं का योग लौटाता है।

sum([3,4,5]) == 3 + 4 + 5 == 12

मैं उस फ़ंक्शन की तलाश कर रहा हूं जो उत्पाद को बदले में देता है।

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60

मुझे पूरा यकीन है कि इस तरह का एक समारोह मौजूद है, लेकिन मैं इसे नहीं पा सकता हूं।

जवाबों:


71

अपडेट करें:

पायथन 3.8 में, गणित मॉड्यूल में उत्पादों को जोड़ा गया । देखें: math.prod ()

पुरानी जानकारी: पायथन 3.7 और पूर्व

जिस कार्य के लिए आप देख रहे हैं, उसे ठेस () या उत्पाद () कहा जाएगा, लेकिन पायथन में वह कार्य नहीं है। तो, आपको अपना खुद का लिखना होगा (जो आसान है)।

ठेस पर उच्चारण ()

हाँ य़ह सही हैं। गुइडो ने इस विचार को खारिज कर दिया एक अंतर्निहित ठेस () फ़ंक्शन के लिए को क्योंकि उन्होंने सोचा था कि इसकी शायद ही कभी आवश्यकता थी।

कम के साथ वैकल्पिक ()

जैसा कि आपने सुझाव दिया है, कम करना () और ऑपरेटर.मूल () का उपयोग करके अपना खुद का बनाना मुश्किल नहीं है :

from functools import reduce  # Required in Python 3
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

ध्यान दें, पायथन 3 में, कम () फ़ंक्शन को फंक्शनल टूल में ले जाया गया था

विशिष्ट मामला: तथ्य

एक साइड नोट के रूप में, ठेस के लिए प्राथमिक प्रेरक उपयोग का मामला () फैक्टोरियल की गणना करना है। गणित मॉड्यूल में इसके लिए हमारे पास पहले से ही समर्थन है :

>>> import math

>>> math.factorial(10)
3628800

लघुगणक के साथ वैकल्पिक

यदि आपके डेटा में फ़्लोट्स हैं, तो आप expors और logarithms के साथ sum () का उपयोग करके किसी उत्पाद की गणना कर सकते हैं :

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

ध्यान दें, लॉग () के उपयोग के लिए आवश्यक है कि सभी इनपुट सकारात्मक हों।


आप यह जोड़ना चाहते हैं कि अंतिम उदाहरण में तैरने के लिए सकारात्मक होना चाहिए । अन्यथा, आपको cmath का उपयोग करना पड़ सकता है, लेकिन तब भी यह वास्तव में सभी मामलों में काम नहीं करेगा।
वेकी

212

असल में, गुइडो ने इस विचार पर जोर दिया: http://bugs.python.org/issue1093

लेकिन, जैसा कि उस मुद्दे में उल्लेख किया गया है, आप एक बहुत आसानी से बना सकते हैं:

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

4
यहाँ एक महान उदाहरण है जहाँ Guido: उत्पाद (फ़िल्टर (कोई नहीं, [1,2,3, कोई भी])) उद्धृत करने के लिए "इसके लिए एक आवश्यकता है" है। उम्मीद है कि इसे किसी दिन शामिल किया जाएगा।
the911s

13
क्या गुइडो भी वह आदमी नहीं है जिसे पसंद नहीं है reduce?
क्रिस मार्टिन

3
हां - और कम करना अब पायथन 3. आईएमओ में भी बिल्टइन नहीं है, हमें वैश्विक बिल्डरों में जोड़े जाने वाले हर संभव सूची ऑपरेटर की आवश्यकता नहीं है, जब एक मानक (या तीसरी पार्टी) लाइब्रेरी करेगी। आपके पास जितने अधिक भवन हैं, उतने ही सामान्य शब्द स्थानीय चर नामों के रूप में ऑफ-लिमिट हो जाते हैं।
ओजार्क

7
बस कम करने () के बारे में गुइडो के ब्लॉग पोस्ट में यह डला मिला । "हमारे पास पहले से ही राशि है (); मैं खुशी से व्यापार को कम कर (उत्पाद के लिए) () ..." । यदि कोई product()मानक पुस्तकालय में शामिल करने के लिए याचिका करना चाहता है , तो इस प्रश्न पर विचारों की संख्या मामले को बनाने में मदद कर सकती है।
पैट्रिक मैक्लेनी

1
@PatrickMcElhaney ऐसा लगता है कि python3 पहले से ही कम बिलिन से छुटकारा पा चुका है। मुझे लगता है कि उत्पाद ने अपना मौका गंवा दिया। ;)
ओज्रेक

41

यहां कोई भी निर्मित नहीं है, लेकिन यहां अपना प्रदर्शन करना सरल है, जैसा कि यहां दिखाया गया है :

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

इस प्रश्न के उत्तर देखें:

किसी सूची में डेटा हेरफेर के लिए कौन सा पायथन मॉड्यूल उपयुक्त है?


8
अगर अजगर 3 का उपयोग कर के functools.reduceबजाय का उपयोग करें reduce
स्टीवन रूंबल्स्की

1
और भी अधिक फंतासी मज़े के लिए:prod = functools.partial(functools.reduce, operator.mul)
bukzor

39

वहाँ एक संख्या prod()में है कि क्या आप के लिए पूछ रहे हैं।


3
ध्यान दें: पायथन लोंगो (मनमाने ढंग से सटीक पूर्णांक) का समर्थन नहीं करता np.prod(range(1,13))है, इसलिए 12 के बराबर सही उत्तर देता है! लेकिन np.prod(range(1,14))नहीं।
जेसन एस

2
@ जैसन np.prod(arange(1,14, dtype='object'))?
एंडोलिथ

1
math.prod()समारोह इस जवाब अप्रचलित कर देगा।
बेनोइट पी

जब आप साधारण वन-लाइनर में यह करना चाहते हैं तब भी गणित को आयात करना कठिन होता है। मुझे कम करना याद है () और गुइडो-अस्वीकृत उत्पाद ()।
RCross

25
Numeric.product 

(या

reduce(lambda x,y:x*y,[3,4,5])

)


वह एक ऐसा कार्य चाहता है जिसे वह मॉड्यूल या लाइब्रेरी से लोड कर सकता है, न कि फ़ंक्शन को स्वयं लिख रहा है।
जेरेमी एल

2
लेकिन अगर वहाँ एक नहीं है, वह शायद अभी भी समारोह चाहता है।
DNS

1
ठीक है, लेकिन उसे पता होना चाहिए कि उसका अस्तित्व नहीं है, क्योंकि यह उसका मुख्य प्रश्न है।
जेरेमी एल

2
आपको 1 का डिफ़ॉल्ट मान कम करना होगा अन्यथा यह अशक्त स्थिति में विफल हो जाएगा। एक खाली अनुक्रम के उत्पाद को 1.23 के रूप में परिभाषित किया गया है
आरोन रॉबसन

3
@CraigMcQueen न्यूमेरिक (एक) संख्या के पूर्ववर्ती है।
ताकसवेल

22

इसे इस्तेमाल करो

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

चूंकि कोई अंतर्निहित prodकार्य नहीं है।


6
आपको लगता है कि कम करना वास्तव में एक
एंटीपैटर्न है

1
वह जानना चाहता था कि क्या कोई मौजूदा फ़ंक्शन मौजूद है जो वह उपयोग कर सकता है।
जेरेमी एल

और यह उत्तर बताता है कि कोई नहीं है।
ईबीग्रीन

5
@zweiterlinde: शुरुआती लोगों के लिए, समस्याओं को कम करता है। इस मामले में, इसका उपयोग करना lambda a,b: a*b, यह कोई समस्या नहीं है। लेकिन कम अच्छी तरह से सामान्य नहीं करता है, और दुरुपयोग होता है। मैं पसंद करता हूं कि शुरुआती लोग इसे न सीखें।
S.Lott

@ S.Lott मैंने कभी भी किसी शुरुआती को कम, किसी भी अन्य कार्यात्मक-एस्के निर्माण का उपयोग करते हुए नहीं देखा है। हेक, यहां तक ​​कि "मध्यवर्ती" प्रोग्रामर आमतौर पर एक सूची समझ से परे नहीं जानते हैं।
मतीन उल्हाक


2

शायद एक "बिलिन" नहीं, लेकिन मैं इसे बिलिन मानता हूं। वैसे भी बस सुन्न का उपयोग करें

import numpy 
prod_sum = numpy.prod(some_list)

यह खतरनाक रूप से "मेरी मशीन पर काम करता है" बयान के करीब है! Numpy, प्यारा, हालांकि, यह अप्रतिम है कि यह एक बिल्डिन नहीं है।
RCross
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.