我正在解决一个包含列表的谜题,遍历每个索引并将值汇总到当前索引的左侧和右侧。如果它找到一个索引,其左边的值之和等于其右边的值的总和,则返回该索引。
例如: [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 :(得分: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是列表中的最后一个元素。