2017-04-20 94 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

有據可查並已鏈接。很好的答案。 –