循环列表返回负索引

时间:2017-04-20 16:36:49

标签: python python-2.7 list for-loop

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

例如: [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?

谢谢!

3 个答案:

答案 0 :(得分: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:]):

(并将list更改为l,因为list是列表类型)

注意i,_符号解压缩索引/值并丢弃此处不需要的值。你也可以选择古典音乐:

for i in range(len(l)):

答案 1 :(得分:3)

for i in list:
    ...

这通过列表的值,而不是索引(因此你为什么得到-4),要通过索引你必须使用xrange(或range for python 3)而不是len (列表)

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

或使用enumerate(list)enumerate在任何可迭代对象上返回索引值对的元组,因此您将对这样的列表进行索引:

for index, value in enumerate(list):
    ...

在这种情况下,指数很可能是你的。另外,you do not want to shadow names已经被python本身使用(即list或max,或者min abs等......),这将覆盖那些变量,使其成为您在程序中分配的变量。例如,list不再是可以从list(iterable)创建列表的函数,但现在无论你将它分配给它,你都不能再以默认的python方式使用它。 Here is a list of python 2.7 built function in names

答案 2 :(得分:0)

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