2012-10-21 11 views
6

yer aldığı bir liste azaltmak kullanarak. reduce üzerinde basit bir varyasyon kullanmaya çalışıyorum, bunu yapmak için bir düz liste yerine çiftlerin listesini düşünün. Ben çizgisinde bir şey yapmak istiyorum: Ben numaralar nums listesinde her öğesi özgüdür toplamına ek bilgi eklemek istiyorumPython Ben nesnelerin toplamı yaparken benzer bir şekilde yaparız, nihai nesne oluşturmak için bir listede bir araya unsurların bir demet eşleştirmeye çalışıyorum çiftleri

nums = [1, 2, 3] 
reduce(lambda x, y: x + y, nums) 

hariç. Her çift (a, b) Listede, (a + b) olarak toplamını çalıştırmak için Örnek:

nums = [(1, 0), (2, 5), (3, 10)] 
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 

Bu işe yaramazsa:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object is unsubscriptable 

Neden çalışmıyor? nokta değil - - Ben düz bir liste olarak nums kodlamak biliyorum ben sadece bir çiftlerinin listesini sürekli tekrarlanması veya aynı anda uzunluk ve havuz iki bilgi üzerinde listelerinden yapabilirsiniz operasyonu azaltmak yaratmak isterler her iki liste. Teşekkürler.

+0

bir tanımlama grubu olmak azaltmak sonucunu ister misin? –

+0

Küçültmek zorunda mısın? Basit toplamı (x [0] + x [1] Nums içinde x) tercih – cerealy

cevap

6

Eğer reduce geçirilen lambda bakıldığında: f tarafından döndürülen değeri f başka çağırma parametresi olarak geçilecek

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1]) 

. Ancak, f parametrelerinin çift olmalarını beklerken, döndürdüğü değer int'dur. Bu işlevi bir çift de döndürmek zorundasınız. Örneğin, bu ayrı ayrı sol ve sağ taraflarını Özetle olacaktır:

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums) 
(6, 15) 

liste elemanlarından farklı birikmiş değer tedavi edilir yapabileceği başka şey: Sen birikmiş değer bir int yapabilir, liste elemanları ise çiftler. Bunu yaparsanız akümülatör bir int doğru başlatılır, böylece, sen reduce için initializer argüman geçmelidir:

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0) 
21 
+0

sadece çifti boyunca azaltmak bir yineleyici almak için bir yolu var mı? Listeler için 'sayma (mylist') 'e benzeyen bir şey, sadece geçerli öğeyi değil, aynı zamanda listedeki konumunu da döndürür. Yukardaki örnekte kullanılan lambda '' azaltma '' çiftin sayısına erişebilir mi? – user248237dfsf

+0

@ user248237 'Enumerate (mylist)' öğesini 'azaltmak 'girişi olarak kullanabilirsiniz. – interjay

İlgili konular