2013-05-19 26 views
19

list comprehension kullanarak sum() gibi bir şey benzetmek mümkün mü? Aynı yapıyorPython - liste anlamasını kullanarak öykünme toplamı()

list = [1, 2, 3] 
product = [magic_here for i in list] 

#product is expected to be 6 

Kodu: Python 3 olacak On

def product_of(input): 
    result = 1 
    for i in input: 
     result *= i 
    return result 
+0

Olası yinelenen: [Python işlevi sum() gibi ancak çarpma için nedir? ürün()?] (http://stackoverflow.com/questions/595374/whats-the-python-function-like-sum-but-for-multiplication-product) –

cevap

29

Hayır; Liste kavraması, girdisi kadar uzun bir liste oluşturur. Python'un diğer işlevsel araçlarından birine (özellikle bu durumda reduce()) fold dizisine tek bir değere ihtiyacınız olacaktır.

+3

İlk cümle için teşekkür ederiz. Aradığım cevap bu. Python 3'teki – StKiller

+0

, son yöntemin de bahsettiğinden bahsetmek için [functools] (https://docs.python.org/3/library/functools.html) modülü – xealits

37
>>> from operator import mul 
>>> nums = [1, 2, 3] 
>>> reduce(mul, nums) 
6 

-

Mesela ben bir listedeki tüm unsurların ürünü hesaplamak gerekir Bu içe aktarmayı eklemeniz gerekir: from functools import reduce

Python 2.5/2.6 yılında Implementation Artifact

Sen şu anda yapım aşamasında liste anlama başvurmak için vars()['_[1]'] kullanabilirsiniz. Bu korkunç ve asla kullanılmalıdır, ancak soruda bahsettiğinize en yakın şey budur ( ürününe öykünme yapmak için bir liste listesi kullanan ).

>>> nums = [1, 2, 3] 
>>> [n * (vars()['_[1]'] or [1])[-1] for n in nums][-1] 
6 
+3

egads, bu sadece ... olay biliyor. – joneshf

+2

bu aslında kinda neat ... Bunu yapabildiğin hakkında hiçbir fikrim yoktu (Ve ne zaman ve ne zaman istersen hiç bir fikrin yok) ... ama bir sonuç elde etmek için bile sneakier yaklaşımı için aynı –

+1

+1'i soğut benim ;-) – Patrick

9

Liste kavraması her zaman başka bir liste oluşturur, bu nedenle bunları birleştirmede kullanışlı değildir (örneğin, tek bir sayı vermek için). Ayrıca, süper sinsi değilseniz, liste anlamada bir ödev yapmanın bir yolu yoktur. Listede yalnızca belirli değerleri dahil etmek istiyorsanız

hiç bir toplamı yöntemi için yararlı olduğu liste türetimi kullanarak görürdünüz sadece zaman, ya da sen numaralarının listesini yok:

list = [1,2,3,4,5] 
product = [i for i in list if i % 2 ==0] # only sum even numbers in the list 
print sum(product) 

veya başka bir örnek "a liste anlama atama yapmak için

# list of the cost of fruits in pence 
list = [("apple", 55), ("orange", 60), ("pineapple", 140), ("lemon", 80)] 
product = [price for fruit, price in list] 
print sum(product) 

Süper sinsi şekilde

0 ... ama o korkunç :) böyle

+0

+1'dir :) – jamylak

3
>>> reduce(int.__mul__,[1,2,3]) 
6 

C:\Users\Henry>python -m timeit -s "" "reduce(int.__mul__,range(10000))" 
1000 loops, best of 3: 910 usec per loop 

C:\Users\Henry>python -m timeit -s "from operator import mul" "reduce(mul,range(10000))" 
1000 loops, best of 3: 399 usec per loop 

C:\Users\Henry> 
4

şey var:

>>> a = [1,2,3] 
>>> reduce(lambda x, y: x*y, a) 
6 
+1

+ y değil x * y ... her ikisi de test verileriniz için aynı sonucu vermesine rağmen –

0

http://code.activestate.com/recipes/436482/ üzerinde sihirli bulundu.

Aşağıdaki kod gibi bir mantık olmalıdır.

L=[2, 3, 4] 
P=[] 
for j in [1]: 
    for i in L: 
     for j in [j*i]: 
      P.append(j) 
print(P[-1]) 
+2

Bu VLQ olarak işaretlendi. Tüm listeyi kurar, sonra tek bir değer alır - bu yüzden çok verimsiz ve teknik olarak "liste anlama ile öykünme" (ki bu da en iyi cevaplarda belirtilen nedenlerden dolayı imkansızdır). Bu bir "örnek" olarak yapabilirdi ancak o kadar kötü ki silinmeyi tavsiye ederim. –

3

Ben Python reduce operatörünü kullanan bazı kod ile Ignacio Vazquez-Abrams cevabını tamamlayacak.Ayrıca

list_of_numbers = [1, 5, 10, 100] 

def sum(x, y): 
    return x + y 

reduce(sum, list_of_numbers) 

Bonus olarak yazılabilir

list_of_numbers = [1, 5, 10, 100] 
reduce(lambda x, y: x + y, list_of_numbers) 

: Python bu işlevselliği sağlayan dahili sum fonksiyonu. Bu en okunaklı ifadedir.

list_of_numbers = [1, 5, 10, 100] 
sum(list_of_numbers)