我正在上 Python 初學者課程。我們不允許匯入任何模塊,也不允許使用 max()、min()、sort(ed)()。我已經定義了自己的 min()max()。但為了簡單起見,我將使用 max()min()。我有一個 2D 陣列,我正在嘗試找到一種方法將陣列的第一行參考到陣列中的一個值。請允許我詳細說明。
第一行是年。第一列是國家。陣列中的資料是人口。我寫了一個宣告來找到一個國家的最大人口......現在我如何寫一個宣告來找到最大人口在哪一年?然后我需要在表格中列印所有內容,其中包含國家、最大人口、發生年份。
到目前為止的代碼:
list = [['countries', 2019, 2020, 2025],['aruba', 2349834,23432098,8798734],['barbados', 445673,980897,342431],['japan', 12131441,7897879,3636436]]
for row in list[1:]:
for colum in row:
maxPop = max(row[1:])
minPop = min(row[1:])
chgPop = float(f'{(((row[3] - row[1]) / row[1]) * 100):.2f}')
print(f'{row[0]:<10}{minPop:25}{maxPop:>20}{chgPop:>15.1f}')
此代碼轉到第二行和第二列,開始處理 maxPop minPop 和 chgPop 的資料。但是現在說我找到了巴巴多斯的 maxPop,我可以很好地列印出來....如何在列印出的那個列印出 maxPop 發生的年份的地方添加另一列?
我推測我會再次遍歷串列,并使用串列中出現 maxPop 的索引參考,并使用該索引參考中的列從第一行中挑選出年份。這個回圈將遍歷整個串列,然后可以將一個名為 maxPopYear 的新變數添加到我的列印陳述句中。但我該怎么做呢?
預期的輸出看起來像這樣
country minpop year maxpop year pop%
aruba 1232198 2020 939439 2019 5.43
barbados 56356 2022 4544 2019 34.33
etc
uj5u.com熱心網友回復:
由于您需要定義您的max()函式,您可以輕松地讓它回傳最大值的索引,或者甚至更好地回傳tuple包含索引和值的索引。因此,當您找到最大值時,您也知道它在資料中的位置。當然,習俗min()也是如此。例如,您可以這樣做:
def mymax(it):
maxval = -1
for i,v in enumerate(it):
if v > maxval:
maxval = v
maxidx = i
return (maxidx, maxval)
mymax([445673,980897,342431])
(1, 980897)
uj5u.com熱心網友回復:
因此,您可以在 python 中使用內置函式 for list 稱為index.
data = [
["countries", 2019, 2020, 2025],
["aruba", 2349834, 23432098, 8798734],
["barbados", 445673, 980897, 342431],
["japan", 12131441, 7897879, 3636436],
]
for row in data[1:]:
for column in row:
maxPop = max(row[1:])
minPop = min(row[1:])
chgPop = float(f"{(((row[3] - row[1]) / row[1]) * 100):.2f}")
year = data[0][row.index(maxPop)]
print(f"{row[0]:<10}{minPop:25}{maxPop:>20}{chgPop:>15.1f}{year:>20}")
這輸出:
aruba 2349834 23432098 274.4 2020
barbados 342431 980897 -23.2 2020
japan 3636436 12131441 -70.0 2019
該index功能的簡單實作是
def index(a:list, value) -> int:
for i, item in enumerate(a):
if item == value:
return i
raise ValueError(f"{value} not in list")
要使用它,只需將行替換為year = data[0][index(row, maxPop)]
或者甚至更好,就像@gimix建議的那樣,將索引作為帶有 max 或 min 函式的元組回傳。您可以呼叫一個函式argmin,argmax該函式分別僅回傳最小值和最大值的索引,并使用它來獲取值。
def argmax(it:list) -> int:
maxval = -1
maxidx = None
for i, v in enumerate(it):
if v > maxval:
maxval = v
maxidx = i
return maxidx
uj5u.com熱心網友回復:
所以代碼看起來像這樣并且可以作業。謝謝!
def maxValue(listValues):
#finds the maximum value of an element in a list
#the input argument is a list
#the function returns the maximum value
maximum = 0
for counter in listValues:
if counter > maximum:
maximum = counter
return maximum
def minValue(listValues):
#finds the minimum value of an element in a list
#the input argument is a list
#the function returns the minimum value
minimum = listValues[0]
for counter in listValues:
if counter < minimum:
minimum = counter
return minimum
list = [['countries', 2019, 2020, 2025],['aruba', 2349834,23432098,8798734],['barbados', 445673,980897,342431],['japan', 12131441,7897879,3636436]]
for row in list:
for colum in row:
minPop = maxValue(row[1:])
minYear = list[0][row.index(minPop)]
maxPop = minValue(row[1:])
maxYear = list[0][row.index(maxPop)]
chgPop = float(f'{(((row[3] - row[1]) / row[1]) * 100):.2f}')
print(f'{row[0]:<10}{minPop:25}{minYear:10}{maxPop:>20}{maxYear:10}{chgPop:>15.1f}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444854.html
上一篇:`mapply`的奇怪行為[R]
