2012-03-15 53 views
4

我試圖在包含整數字符串的列表上使用pythons reduce函數。嘗試使用包含字符串的列表的reduce()和lambda

print int("4") 
\\Gives me 4 Good 
print reduce(lambda x, y: x*y, [2, 3, 4]) 
\\Gives me 24 Good 
print reduce(lambda x, y: x*int(y), ['2', '3', '4']) 
\\Gives me 222222222222 What?? 

我假設reduce給lambda函數的東西不是列表中的實際字符串?我不知道爲什麼我至少得到222222222222,會不會有一個簡單的方法來使列表成爲int?我想我可以只是我們另一個循環,但我仍然想知道傳遞字符串有什麼問題。

+0

在這短暫的時間裏,我並不期待這麼多答案。感謝大家的幫助。 對於任何新的,我最終使用 '減少(lambda x,y:x * int(y),['2','3','4'],1)'from @ÓscarLópez – 2012-03-15 01:08:15

回答

7
>>> reduce(lambda x, y: x*int(y), ['2', '3', '4']) 
'222222222222' 

好了,這是發生了什麼:

在第一簡步驟,以下計算完成:'2' * 3。由於第一個操作數是一個字符串,它只會重複3次。所以你最終以'222'

在第二個縮小步驟中,該值乘以4:'222' * 4。再次,該字符串重複四次,其結果爲'222222222222'這正是您得到的結果。

您既可以由轉換x爲int以及(主叫int(x))避免這種情況,或者使用在首位的整數轉換映射列表中的元素(其實,我覺得這是更優雅):

>>> reduce(lambda x, y: x * y, map(int, ['2', '3', '4'])) 
24 
+0

感謝優秀的答案,我把這作爲答案,因爲它是最豐富的答案。 – 2012-03-15 01:06:57

1

你用int 3乘以字符串'2',它給出字符串'222'...然後字符串'222'被int 4給出,這給出字符串'222222222222'。

您需要將x轉換爲整數:

print reduce(lambda x, y: int(x)*int(y), ['2', '3', '4']) 
0
multiply = lambda a,b: a*b 
listOfInts = map(int, ['2','3','4']) 

reduce(multiply, listOfInts) #output: 24 
+0

甚至更​​好:「從運營商導入多個乘法」# – 2012-03-15 01:16:11

+0

@ÓscarLópez:謝謝,我想到了這一點,但我寧願寫清楚它的通用性。我發現很多你希望在默認命名空間中的函數必須被導入。 – ninjagecko 2012-03-15 01:25:29

4

你可以試試這個:

reduce(lambda x, y: x*int(y), ['2', '3', '4'], 1) 

請注意,我傳遞一個第三個參數reduce,IND該操作應該在1(乘性身份)中初始化。這樣,您只需要將y,目前的的值轉換爲int,而不是x的值爲的值。

+2

+1。這確實是一個很好的解決方案。要添加一些解釋:在'reduce'調用中傳遞的'1'使其成爲默認值/起始值,因此第一個減少步驟實際上是1 * int('2')'。 – poke 2012-03-15 00:54:26

+1

感謝您的回答,我最終使用這個,因爲它似乎對我來說是最有效的。 – 2012-03-15 01:07:07

+1

@JustinEgli我也認爲這是最高效的,因爲它不會創建任何中間列表(如'map')。 – 2012-03-15 01:14:43

相關問題