2013-03-15 68 views
0

有沒有什麼方法可以比較列表中選定元素的左右兩邊的總和? 例如:在Python中查找列表元素左右手的總和

li = [2,3,0,9,6] 
if selected item is '0', I want to compare sum of 2,3 and 9,6 

在此先感謝

+0

是選擇真'0'或者是它'的Li [2]'(即,是的值,或在列表中的位置是選擇)? – askewchan 2013-03-15 23:28:15

+4

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Volatility 2013-03-15 23:28:50

+0

左/右如何定義?什麼是comp。對於'li = [1,2,1]'? – 2013-03-15 23:37:25

回答

10
li = [2,3,0,9,6] 

如果你給出0(或任意數量):

n = 0 
i = li.index(n)  # returns the first location of n (0 in your case) 
left = li[:i]  # gives the left part of the list 
right = li[i+1:] #  and the right part 
lsum = sum(left) 
rsum = sum(right) 

但你必須要小心,因爲.index返回第一該項目的實例。如果您有多個0,它會將該列表拆分爲第一個0

如果給出它的位置,只需從上面的i開始而不搜索。

i = 2 
left = sum(li[:i]) 
right = sum(li[i+1:]) 

請注意,我已將最後兩行合併在一起,並且不保存單獨的列表。

然後,您可以根據需要比較leftright

+0

+1如果0不在列表中,處理異常也很好。 – jurgenreza 2013-03-16 01:52:50

+0

@jurgenreza好的我會說清楚零可以改變。 – askewchan 2013-03-16 01:55:19

4

如果有partition它是可以用來split單一值的輸入,然後 - 類似askewchan的答案,但可以採取任意迭代,而不是一個需要能夠索引(注意,這是的lambda濫用):

li = [2,3,0,9,6] 

from itertools import takewhile 
print (lambda L=iter(li): sum(takewhile(lambda e: e != 0, L)) == sum(L))() 
# False 

更明智的方式

def partitions_equal(iterable, at): 
    i = iter(iterable) 
    return sum(iter(i.next, at)) == sum(i) 
+0

正如你所說,這是對lambda的濫用,它所得到的唯一結果就是將3行變成2,所以...爲什麼不把它寫成pythonic的方式,用'L = iter(li)'在一行上,並且下一行的比較? – abarnert 2013-03-16 00:16:57

+0

@abarnert更明智的答案發布 – 2013-03-16 00:22:59

+0

「更明智的方式」不會做「濫用lambda」方式相同的事情。值得展示和解釋差異(一個需要一個值,另一個是索引) - 同時也不值得使用lambda來寫兩者。 – abarnert 2013-03-16 01:00:24