2017-04-20 96 views
1

我正在解决一个列表中的难题,循环遍历每个索引并将值汇总到当前索引的左侧和右侧。如果它找到一个索引,其中左边的值的总和等于右边的值的总和,则返回该索引。循环遍历返回负索引

例如: [1,2,3,4,3,2,1] 如果我在索引3(值为4),我们看到元素左右值的总和是等于。 (1 + 2 + 3)=(3 + 2 + 1)。

但是,当输入是负值列表时,它会返回负值索引。这是我的代码:

def get_equal_sum(list): 
    for i in list: 
     if sum(list[:i]) == sum(list[i+1:]): 
      print i 

list = [1,2,3,4,3,2,1] 
get_equal_sum(list) 
>>> 3 

list = [-1,-2,-3,-4,-3,-2,-1] 
get_equal_sum(list) 
>>> -4 

为什么返回-4,而不是3?

谢谢!

+0

第二个列表中没有'3',怎么能打印'3'?您正在打印元素,而不是索引。 – Carcigenicate

+2

你可能不应该在你的变量中隐藏内置的类型/函数('list')。 –

+3

你并没有返回索引,而是返回值本身。使用'enumerate'获取索引。 –

回答

4

当你

for i in list: 
    if sum(list[:i]) == sum(list[i+1:]): 

i列表的索引,但。当您向切片提供负值时,它不会与IndexError一起崩溃,这是因为只要绝对值在范围内(这里是这种情况),python支持负索引(列表末尾的索引) 。这可能就是你错过的原因。

如果你想索引你必须使用enumerate例如:

for i,_ in enumerate(l): 
    if sum(l[:i]) == sum(l[i+1:]): 

(和改变listl因为list是列表类型)

注意i,_符号来解压索引/值和丢弃这里不需要的值。你也可以去与经典:

for i in range(len(l)): 
+0

然后在'if'语句为'True'时打印'_'。 – GiantsLoveDeathMetal

+0

@GiantsLoveDeathMetal我明白你的观点,但我认为OP也希望打印索引(因此也是''我的名字)。这些值仅在测试平等的子列表时使用。如果我想使用变量,我不会使用'_'。 –

+0

是啊OP想要'返回我',我在我的评论中得到了错误 – GiantsLoveDeathMetal

0

因为-4是在指数-4。您可以在Python中使用负数索引,索引-1是列表中的最后一个元素。

3
for i in list: 
    ... 

此经过列表,而不是指数(因此你为什么你-4),要经过索引则必须在LEN使用xrange(或的Python 3)(表)

for i in xrange(len(list)): 
    ... 

或使用enumerate(list)enumerate返回任何可重复的对象的索引值对的元组,所以你会指数在像这样的列表:

在这种情况下,指数可能你我。另外,python本身已经使用了you do not want to shadow names(即列表或最大值,或最小绝对值等),这将覆盖这些变量,将其分配给您的程序。例如,列表不再是一个可以从list(iterable)创建列表的函数,但是现在您将它分配给它,您不能再以默认的python方式使用它。 Here is a list of python 2.7 built function in names

+0

有据可查并已链接。很好的答案。 –