Ich muss eine Funktion schreiben, die eine Liste von Zahlen nimmt und sie miteinander multipliziert . Beispiel:
[1,2,3,4,5,6]
wird mir geben 1*2*3*4*5*6
. Ich könnte deine Hilfe wirklich gebrauchen.
Ich muss eine Funktion schreiben, die eine Liste von Zahlen nimmt und sie miteinander multipliziert . Beispiel:
[1,2,3,4,5,6]
wird mir geben 1*2*3*4*5*6
. Ich könnte deine Hilfe wirklich gebrauchen.
Antworten:
Python 3: benutze functools.reduce
:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Python 2: benutze reduce
:
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Für die Kompatibilität mit 2 und 3 pip install six
gilt dann:
>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
lambda
durchschnittlich 0,02 Sekunden / 1000 Wiederholungen benötigt, während operator.mul
im Durchschnitt 0,009 Sekunden / 1000 Wiederholungen durchgeführt wurden, wodurch operator.mul
eine Größenordnung schneller wurde.
operator.mul
direkt zu C.
math.prod([1,2,3,4,5,6])
. (erfordert natürlich den Import)
Sie können verwenden:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
Siehe reduce
und operator.mul
Dokumentationen für eine Erklärung.
Sie benötigen die import functools
Zeile in Python 3+.
reduce()
Funktion aus dem globalen Namespace entfernt und im functools
Modul platziert wurde. In Python3 müssen Sie also sagen from functools import reduce
.
Ich würde das verwenden numpy.prod
, um die Aufgabe auszuführen. Siehe unten.
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
result = np.prod(mylist)
numpy.int32
wie oben verwendet wird. 2) Bei kleinen Listen ist dies erheblich langsamer, da NumPy ein Array zuweisen muss (relevant, wenn es häufig wiederholt wird)
np.prod(np.array(range(1,21)))
reduce
.
Wenn Sie das Importieren von Objekten und komplexere Bereiche von Python vermeiden möchten, können Sie eine einfache for-Schleife verwenden
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
Ab dem Start Python 3.8
wurde eine .prod
Funktion in das math
Modul in der Standardbibliothek aufgenommen:
math.prod(iterable, *, start=1)
Die Methode gibt das Produkt eines start
Werts (Standard: 1) mal einer iterierbaren Zahl zurück:
import math
math.prod([1, 2, 3, 4, 5, 6])
>>> 720
Wenn die Iterable leer ist, wird dies erzeugt 1
(oder der start
Wert, falls angegeben).
Hier sind einige Leistungsmessungen von meinem Computer. Relevant für den Fall, dass dies für kleine Eingaben in einer langen Schleife durchgeführt wird:
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}')
Ergebnisse:
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
Sie können sehen, dass Numpy bei kleineren Eingaben etwas langsamer ist, da es ein Array zuweist, bevor die Multiplikation durchgeführt wird. Achten Sie auch auf den Überlauf in Numpy.
multiply_functools
und zeichnen multiply_numpy
sich durch zu sehen , die gewogen np
, functools
und operator
Globals, gefolgt von Attribut - Lookups. Würde es Ihnen etwas ausmachen, zu Einheimischen zu wechseln? _reduce=functools.reduce,
_mul = operator.mul` in der Funktionssignatur, dann return _reduce(_mul, iterable)
im Körper usw.
np.prod()
Option mit 100 oder mehr Elementen am schnellsten gestartet .
Ich persönlich mag dies für eine Funktion, die alle Elemente einer generischen Liste miteinander multipliziert:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
Es ist kompakt, verwendet einfache Dinge (eine Variable und eine for-Schleife) und fühlt sich für mich intuitiv an (es sieht so aus, als würde ich das Problem betrachten, nehmen Sie einfach eines, multiplizieren Sie es, multiplizieren Sie es mit dem nächsten und so weiter! )
for i in n:
, dann total *= i
? wäre es nicht viel einfacher?
Der einfache Weg ist:
import numpy as np
np.exp(np.log(your_array).sum())
np.prod(your_Array)
Numpy
hat die prod()
Funktion, die das Produkt einer Liste zurückgibt, oder in diesem Fall, da es numpy ist, ist es das Produkt eines Arrays über einer bestimmten Achse:
import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)
... oder Sie können einfach importieren numpy.prod()
:
from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)
Ich habe diese Frage heute gefunden, aber ich habe festgestellt, dass es nicht den Fall gibt None
, in dem es in der Liste gibt. Die vollständige Lösung wäre also:
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))
Im Falle der Hinzufügung haben wir:
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))
*
, sodass eval dies als Multiplikativ erkennt. Ich frage mich, wie die Leistung diesbezüglich ist, insbesondere im Vergleich zu anderen Lösungen
Ich möchte dies folgendermaßen:
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
Meine Lösung:
def multiply(numbers):
a = 1
for num in numbers:
a *= num
return a
pass
'' 'die einzige einfache Methode, um die Logik für die Schleife zu verstehen' ''
Runde = [2,5,7,7,9] x = 1 für i in Runde: x = i * x print (x)
Es ist sehr einfach, nichts zu importieren. Das ist mein Code. Dadurch wird eine Funktion definiert, die alle Elemente in einer Liste multipliziert und ihr Produkt zurückgibt.
def myfunc(lst):
multi=1
for product in lst:
multi*=product
return product