2016-10-04 92 views
0

計數變量我有值的數組:問題可以用Python while循環

increase_pop = [500, -300, 200, 100] 

我試圖找到的最低值和最高值的指數。我的大部分代碼都可以工作,除了一個問題,一切似乎都進行得很順利。我的代碼的其餘部分如下所示:

max_value = increase_pop[0] 
min_value = increase_pop[0] 

count = 0 
while count < len(increase_pop): 
    if increase_pop[count] > max_value: 
     max_year = count 
     max_value = increase_pop[count] 
    elif increase_pop[count] < min_value: 
     min_value = increase_pop[count] 
    count += 1 

print(min_value) 
print(max_value) 

此代碼正是我想要的最小和最大值。不過,我也想要這些職位的指數值。所以對於最大值我有變量max_year =計數分配給它。因此,我認爲max_year將被分配到發現max_value的位置處的計數。但是,當我做了打印(MAX_YEAR)我得到以下錯誤:

UnboundLocalError: local variable 'max_year' referenced before assignment 

有誰知道我的(可能)很小/次要的問題是什麼?我忘了什麼?

+0

循環 – gherkin

+0

找到最大/最小的另一種方法前加MAX_YEAR = 0:(increase_pop)'MAX(枚舉, key = lambda x:x [1])[0]' –

+0

像這樣使用while循環對推理代碼很有好處,但更常見的Python會使用'for index,pop_count枚舉(increase_pop):'索引和價值。 – RemcoGerlich

回答

2

你可以讓你的代碼更Python使用列表的功能:

min_value = min(increase_pop) 
max_value = max(increase_pop) 
min_value_index = increase_pop.index(min_value) 
max_value_index = increase_pop.index(max_value) 
+0

明白了!這個作品謝謝你! –

+0

這也不錯,但是如果您處理的序列非常大,則需要注意一點:您正在多次掃描序列。 – jez

+0

我測試了代碼。看起來功能將花費比min,max更多的時間。 – Howardyan

2

max_year在滿足第一個條件滿足時分配給第一個if。但是,如果這從來沒有發生,max_year將永遠不會被分配。當increase_pop[0](因此初始值max_value)是increase_pop中的最大值時,將出現這種情況:那麼increase_pop[count] > max_value永遠不會成立。

在你的代碼,你可以簡單地初始化max_year = count = 0

然而,IMO最整潔,最Python化的解決方案是一個由帕特里克·霍先生的評論:

max_year, max_value = max(enumerate(increase_pop), key=lambda x: x[1]) 

要解包:enumerate(increase_pop)生成的序列配對:

(0, increase_pop[0]), (1, increase_pop[1]), ... 

max運營商根據「最大」這樣的配對標準由key指定(並且該特定的按鍵功能只是說「僅考慮每對中的第二個值」)。

+0

我在讀這篇文章,我明白了,但是如何找到max_year值的索引呢? –

+0

@MikeCuddy:當第一個值是最大值時會發生這種情況。只需在循環之前將max_year設置爲0(因爲您還設置了max_value的值,因此在此設置索引以保持事物一致) – RemcoGerlich

+0

感謝您的幫助! –