2013-03-15 78 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