我需要考慮一個游泳池"legitimate"。對于給定的串列,函式應該回傳"illegitimate". "legitimate"但是,即使我沒有對資料做任何事情,我的代碼也會回傳。
這是我嘗試過的代碼,"illegitimate"在嘗試修改串列之前我期待/應該回傳。
pool = [[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]]
def is_legitimate_pool(pool):
for r in range(len(pool)):
for l in range(len(pool[r])):
if pool[r][0] == 1 or pool[4][l] == 1:
return str("illegitimate")
elif pool[r][0] == 0 or pool[4][l] == 0:
return str("legitimate")
print(is_legitimate_pool(pool))
uj5u.com熱心網友回復:
解決方案
您可以首先檢查第一個和最后一個子串列中的任何元素是否非零。i傳遞給的任何非零整數bool(i)都將評估為True,只有零是“假的”(請參閱??真值測驗)。這使我們可以簡單地使用內置any函式來檢查這兩個串列。如果回傳 True,則至少有一個元素不為零。
然后我們只遍歷其他子串列并檢查它們的第一個或最后一個元素是否為假(即零)。如果至少有一個不是,我們可以立即回傳。如果我們到達回圈的末尾,這意味著“池是合法的”。
代碼
LEGIT = "legitimate"
NOT_LEGIT = "illegitimate"
def is_legitimate_pool(pool: list[list[int]]) -> str:
if any(pool[0]) or any(pool[-1]):
return NOT_LEGIT
for row in pool[1:-1]:
if row[0] or row[-1]:
return NOT_LEGIT
return LEGIT
測驗
test_pool1 = [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
]
test_pool2 = [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
]
test_pool3 = [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
]
print(is_legitimate_pool(test_pool1)) # illegitimate
print(is_legitimate_pool(test_pool2)) # illegitimate
print(is_legitimate_pool(test_pool3)) # legitimate
警告
當然,假設是,我們只對“池的邊界”存在感興趣,0并且元素只能是0or 1。如果您確實需要顯式檢查邊框元素是否為1s,我們必須更嚴格一些:
def is_legitimate_pool(pool: list[list[int]]) -> str:
if any(element == 1 for element in pool[0] pool[-1]):
return NOT_LEGIT
for row in pool[1:-1]:
if row[0] == 1 or row[-1] == 1:
return NOT_LEGIT
return LEGIT
代碼中的錯誤
您的原始功能存在許多問題。其中之一是在您檢查每個子串列之前,您不得回傳。您需要檢查它們中的每一個,但是如果您的elif-condition 成立,您有一個回傳“合法”的陳述句,一旦只有一行滿足該條件,就會中斷回圈。
第二個問題是你的索引都搞砸了。該運算式if pool[r][0] == 1 or pool[4][l] == 1相當于說“如果行中的第零個元素r或行中的l第-個元素4等于1”。所以你的第二部分只是檢查 row 4。您應該r在這兩種情況下檢查 row ,但該行中的0第 -th 和4-th 元素是1,所以是這樣的if pool[r][0] == 1 or pool[r][4] == 1:
最后,您沒有考慮到第一行和最后一行根本不能包含任何 1內容。您必須在某個時候檢查(最好在開始回圈之前)。
優化
修復這些問題將使函式正常作業,但它仍然不是最佳的,因為您只能處理5x5的串列串列,因為您將連續的索引硬編碼為4“最后一個”元素。如果您改為使用 index -1,則無論串列有多長,它都會參考最后一個元素。
為了可讀性,您應該盡可能避免“索引雜耍”,而是利用串列是可迭代的這一事實,因此可以在for-loops 中使用,這些元素一個接一個地產生每個元素。這樣我們就可以顯式地命名并處理 中的每個子串列/行pool,從而使代碼對讀者/您自己來說更加清晰。
str("legitimate")是對字串字面量的無操作"legitimate"。你不需要這個str功能。
您應該避免在本地命名空間中隱藏全域名稱。這意味著,如果您有一個名為 的全域變數pool,那么您的函式中也不應該有一個區域范圍的變數pool。更改一個或另一個,使它們具有不同的名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/525745.html
