পাইথনের সাথে কীভাবে আমি তালিকার সমস্ত আইটেমগুলিকে গুণতে পারি?


204

আমার একটি ফাংশন লিখতে হবে যা সংখ্যার একটি তালিকা নেয় এবং তাদের একসাথে গুণ করে। উদাহরণ: [1,2,3,4,5,6]আমাকে দেবে 1*2*3*4*5*6। আমি সত্যিই আপনার সাহায্য ব্যবহার করতে পারে।

উত্তর:


208

পাইথন 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

আপনি অপারেটর আমদানি করবেন না, সুতরাং এই সমাধানটি কিছুটা কমপ্যাক্ট। আমি অবাক যা দ্রুত।
ঝিল্ড

30
@ জেহেল্ড: আমি সংখ্যাগুলি 1 থেকে 100 পর্যন্ত উত্পাদনের সময়সীমা তৈরি করেছি p পাইথন 2 এবং 3 উভয় ক্ষেত্রেই lambdaগড়ে .02 / 1000 পুনরাবৃত্তি নেওয়া হয়েছিল, যেখানে operator.mulগড়ে .009s / 1000 পুনরাবৃত্তি হয়েছিল, operator.mulদ্রুততর আকারের ক্রম তৈরি করে।
Whereswalden

4
@WordsFortheways সম্ভবত এটি অতিরিক্ত ফাংশন (ল্যাম্বডা) দিয়ে যাওয়ার ফলে ওভারহেড যুক্ত হয়, যেখানে operator.mulসোজা সি তে যায়
Whereswalden

4
আমি .009 কে .02 এর চেয়ে কম মাত্রার অর্ডার বলব না। এটা প্রায় অর্ধেক।
jlh

1
পাইথন ৩.৮ হিসাবে এটি কেবল সহকারে করা যায় math.prod([1,2,3,4,5,6])। (অবশ্যই আমদানির প্রয়োজন)
টমেরিকু

168

তুমি ব্যবহার করতে পার:

import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)

একটি ব্যাখ্যা জন্য ডকুমেন্টেশন দেখুন reduceএবং operator.mul

import functoolsপাইথন 3+ তে আপনার লাইন দরকার ।


32
দ্রষ্টব্য যে পাইথন 3-তে, reduce()ফাংশনটি বিশ্বব্যাপী নেমস্পেস থেকে সরিয়ে functoolsমডিউলটিতে রাখা হয়েছে । সুতরাং পাইথন 3 এ আপনাকে বলা দরকার from functools import reduce
ইউজিন ইয়ারমাস

2
তৃতীয় যুক্তি হিসাবে '1' এখানে অপ্রয়োজনীয়, এটির ক্ষেত্রে এটির প্রয়োজন কী?
শব্দসুখে

5
তৃতীয় যুক্তি ছাড়াই @WWWhehewards, আপনি যদি এটি খালি ক্রমটি পাস করেন তবে এটি
টাইপররর

1
lambda x,y: x*yএছাড়াও পরিবর্তে কাজ করেoperator.mul

78

আমি numpy.prodকাজটি সম্পাদন করতে ব্যবহার করব । নিচে দেখ.

import numpy as np
mylist = [1, 2, 3, 4, 5, 6] 
result = np.prod(np.array(mylist))  

13
আপনি যদি ইতিমধ্যে নম্পি ব্যবহার করেন তবে সুবিধাজনক। আপনার সম্ভবত এটি প্রথমে তালিকা হিসাবে কাস্ট করার প্রয়োজন নেই, এটি বেশিরভাগ ক্ষেত্রে কাজ করা উচিতresult = np.prod(mylist)
নিক

4
দুটি বিষয় লক্ষ্য রাখবেন: ১) এটি উপচে পড়তে পারে, বিশেষত numpy.int32উপরের মতো ডিফল্টটি ব্যবহার করা 2) ছোট তালিকার জন্য এটি উল্লেখযোগ্যভাবে ধীর হবে, যেহেতু নুমপিকে একটি অ্যারে বরাদ্দ করা দরকার (প্রায়শই পুনরাবৃত্তি হলে প্রাসঙ্গিক)
বিচ্ছিন্ন

1
21 এর উপরে np.prod(np.array(range(1,21)))
মানেরগুলির

এটি একটি ভাল পছন্দ নয়। এটি উপচে পড়তে পারে এবং এটি ধীর হয়। চেষ্টা reduce
পাইম্যান

57

আপনি যদি কোনও কিছু আমদানি করতে এবং পাইথনের আরও জটিল অঞ্চলগুলি এড়াতে চান তবে লুপের জন্য আপনি একটি সাধারণ ব্যবহার করতে পারেন

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

7
গৌণ দ্রষ্টব্য: পাইথনে স্লাইসগুলি খুব সহজ, এবং যেহেতু আমরা এখানে কেবল আদিমদের সাথেই কাজ করছি, আপনি তালিকাটি [0] দিয়ে শুরু করে তালিকার উপরের পুনরাবৃত্তি [1:] এর মাধ্যমে 1 দিয়ে শুরু করার ক্ষুদ্র ক্লেজটি এড়াতে পারবেন। যদিও এখানে আরও কার্যকরী 'হ্রাস' উত্তরগুলির সাথে স্বাচ্ছন্দ্য বোধ করা দীর্ঘমেয়াদে মূল্যবান কারণ এটি অন্যান্য পরিস্থিতিতেও কার্যকর।
কুংফু

@ কুংফু খালি পণ্যটি সাধারণত 1 হিসাবে সংজ্ঞায়িত করা হয়, আপনি যদি খালি ক্রমটি পাস করেন তবে আপনার সমাধানটি সূচকের ব্যতিক্রম ছুঁড়ে ফেলবে
ফ্রান্সিসকো কুজো

@ ফ্রেঞ্চিস্কো মঞ্জুর, তবে এই ফাংশনটির ক্ষেত্রে সম্ভবত ব্যতিক্রমের কিছু গন্ধ ছড়িয়ে দেওয়া উচিত , যেহেতু একটি খালি ক্রম এই ফাংশনের জন্য অবৈধ ইনপুট হবে। আসলে, এই ফাংশনটি দুটি মানের চেয়ে কম মানের কোনও ক্রমের জন্য অর্থবহ নয়; যদি আপনি একটি মান দিয়ে ক্রমটি পাস করেন এবং এটি 1 দিয়ে গুণ করেন, আপনি মূলত সেখানে একটি মান যুক্ত করেছিলেন যা আমি অপ্রত্যাশিত আচরণের পরিমাণ হিসাবে বলব।
কুংফু

1
@ কুংফু, এই উত্তরের আচরণটি সঠিক, অর্থাত্ 1 দৈর্ঘ্যের একটি তালিকা পাস করে মান দেয়, এবং দৈর্ঘ্যের 0 টি তালিকা প্রদান করে 1 এটি ভাবনার একই লাইনে যা সমষ্টি ([]) হিসাবে 0 বা যোগফল দেয় ([3]) হিসাবে 3. দেখুন: en.wikipedia.org/wiki/Empty_product
emorris

আমি আপনার গাণিতিক ফাংশন সম্পর্কিত বিষয় দেখছি। তবে ব্যবহারিক উন্নয়ন পরিস্থিতিতে, আমি এটি একটি খুব বিরল অবস্থা যেখানে একটি ফাংশন যা স্পষ্টভাবে ইনপুটের কাজ চালানোর জন্য উদ্দীষ্ট এমন কল করবে উচিত কোন ইনপুট অথবা অবৈধ ইনপুট পরিমাণ দেওয়া একটি মান ফিরে। আমি অনুভব করি যে এটি অনুশীলনের লক্ষ্যের উপর নির্ভর করে: যদি এটি কেবল স্ট্যান্ডার্ড লাইব্রেরিটির অনুলিপি করা হয়, ঠিক আছে, সম্ভবত এটি ভাষা (বা ক) ভাষা কীভাবে প্রয়োগ করা যায় বা প্রয়োগ করা যায় সে সম্পর্কে লোকদের কিছু শেখায়। অন্যথায় আমি বলব এটি বৈধ এবং অবৈধ যুক্তি সম্পর্কিত একটি পাঠ প্রদানের একটি ভাল সুযোগকে হাতছাড়া করে।
কুংফু

14

শুরু করে 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মান প্রদান করা হলে)।


10

আমার মেশিন থেকে এখানে কিছু পারফরম্যান্স পরিমাপ। প্রাসঙ্গিক ক্ষেত্রে এটি দীর্ঘ-চলমান লুপে ছোট ইনপুটগুলির জন্য সঞ্চালিত হয়:

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

আপনি দেখতে পারেন যে ছোট ইনপুটগুলিতে নিম্পি বেশ খানিকটা ধীর গতির, কারণ এটি গুণনের আগে একটি অ্যারে বরাদ্দ করে। এছাড়াও, নিম্পিতে ওভারফ্লোতে নজর রাখুন।


আপনি যোগ করতে পারিনি Eval পথ শুধু আউট কৌতুহল
Mr_and_Mrs_D

আমার সন্দেহ হয় multiply_functoolsএবং multiply_numpy এগুলি অনুসন্ধান করে ওজন করা হয় np,functools এবং operatorglobals, গুণ লুক-অনুসরণ। আপনার কি স্থানীয়দের কাছে স্যুইচ করার আপত্তি আছে? _reduce=functools.reduce, _মুল = অপারেটর.মুল` ফাংশনের স্বাক্ষরে তারপর return _reduce(_mul, iterable)শরীরের মধ্যে ইত্যাদি
মার্টিজন পিটারস

1
এছাড়াও, নমাপি সংস্করণটি প্রথমে সংখ্যাগুলিকে একটি নমপি অ্যারে রূপান্তর করতে হবে; সময়সীমার মধ্যে অন্তর্ভুক্ত করার জন্য আপনি সাধারণত ইতিমধ্যে সেই রূপান্তরটি তৈরি করেছিলেন। তালিকাটি একবার নাম্পার অ্যারেতে রূপান্তরিত হওয়ার সাথে সাথে np.prod()বিকল্পটি 100 টি উপাদান বা তারও বেশি দ্রুততম হয়ে ওঠে।
মার্টিজন পিটারস

8

আমি ব্যক্তিগতভাবে এটি এমন একটি ফাংশনের জন্য পছন্দ করি যা জেনেরিক তালিকার সমস্ত উপাদানকে এক সাথে গুণ করে:

def multiply(n):
    total = 1
    for i in range(0, len(n)):
        total *= n[i]
    print total

এটি কমপ্যাক্ট, সহজ জিনিসগুলি (একটি পরিবর্তনশীল এবং লুপের জন্য) ব্যবহার করে এবং আমার কাছে স্বজ্ঞাত বোধ করে (দেখে মনে হচ্ছে যে আমি কীভাবে সমস্যাটি নিয়ে ভাবব, কেবল একটি নিয়েছি, এটিকে গুণ করব, তারপরে পরবর্তী দিয়ে গুণ করব) ইত্যাদি! )


3
দুর্দান্ত, এটি সবচেয়ে সহজ এবং সবচেয়ে সাধারণ।
ঘোস্টক্রাভিজ

4
কেন নয় for i in n:, তাহলে total *= i? এটা কি খুব সহজ হবে না?
মুনিম মুন্না

@ মুনিমমুন্না এটি উপরের পদ্ধতিতে আমার পক্ষে কাজ করেনি।
অ্যাথুল


3

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)

2

এই প্রশ্নটি আজ খুঁজে পেয়েছি তবে আমি লক্ষ্য করেছি যে তালিকার যেখানে আছে সেখানে এটির ক্ষেত্রে নেই 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))

2
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))

5
আপনার উত্তরে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। কীভাবে উত্তর দিন
xenteros

3
আমি কোডটি চিম ইন করে ব্যাখ্যা করার চেষ্টা করি: আমি ব্যক্তিগতভাবে এই কোডটি খুব বেশি পছন্দ করি না, যেহেতু এটি ওয়াল ব্যবহার করে, যা স্ট্রিংটিকে আর্গুমেন্ট বা ফাংশন হিসাবে ব্যাখ্যা করে (এবং সাধারণত এটি অনিরাপদ জিনিস হিসাবে দেখা হয়, বিশেষত ইনপুট ডেটা পরিচালনা করার সময় )। তার আগে যে লাইনটি প্রতিটি বিস্মৃত কমাটি একটি গুণক দ্বারা প্রতিস্থাপিত করে *, যেমন alভাল এটিকে একটি গুণক হিসাবে স্বীকৃতি দেয়। আমি আশ্চর্য হই যে অন্যান্য সমাধানের তুলনায় এই ক্ষেত্রে পারফরম্যান্সটি কীভাবে বৈজ্ঞানিকভাবে হয়
ডেনলিংগার

বাহ, এতো খারাপ ধারণা!
কোওলস্কি

1

আমি নিম্নলিখিত পদ্ধতিতে এটি চাই:

    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

1

এটি আমার কোড:

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)


0

পুনরাবৃত্তি ব্যবহার সম্পর্কে কীভাবে?

def multiply(lst):
    if len(lst) > 1:
        return multiply(lst[:-1])* lst[-1]
    else:
        return lst[0]


-1

লুপের জন্য যুক্তি ব্যবহারকে বোঝার একমাত্র সহজ পদ্ধতি '' '

ল্যাপ = [2,5,7,7,9] ল্যাপ ইন আই এর জন্য x = 1: x = i * এক্স প্রিন্ট (এক্স)


আপনার উত্তর এই প্রশ্নের আলোচনায় নতুন কিছু যুক্ত করে না।
সিড

-3

এটি খুব সাধারণ কিছু আমদানি করবেন না। এটি আমার কোড। এটি এমন কোনও ফাংশন সংজ্ঞায়িত করবে যা তালিকার সমস্ত আইটেমকে গুণিত করে এবং তাদের পণ্য ফেরত দেয়।

def myfunc(lst):
    multi=1
    for product in lst:
        multi*=product
    return product

2
ডেডচেক্সের উত্তরের নকল, পাইশকের জবাব, শক্তি নন্দনের উত্তর। ইতিমধ্যে প্রস্তাবিত উত্তর পোস্ট করবেন না।
মুনিম মুন্না

এটিও মাল্টি | - | ফিরে আসবে
লার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.