Python有一個built-in min
function。但我想這是一個很好的學習練習來寫你自己的。
通過創建test
函數的修改版本,我們可以編寫一個函數來查找包含最小元素的子列表。
關鍵的想法是找到每個子列表的最小值,當我們找到一個新的最小值時,我們存儲那個最小值來自的子列表。
在下面的代碼中,我將函數名稱從test
更改爲minimum
以使其更有意義。
def minimum(list1):
''' Finds smallest item in list1 '''
x = list1[0]
for i in list1:
if i < x:
x = i
return x
def least(list2d):
minseq = list2d[0]
x = minimum(minseq)
for seq in list2d[1:]:
i = minimum(seq)
if i < x:
x = i
minseq = seq
print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq))
# Test
data = [[2, 4, 3], [1, 7, 9, 4], [6, 7, 5]]
least(data)
輸出
In [[2, 4, 3], [1, 7, 9, 4], [6, 7, 5]] the least number is 1 found in sublist [1, 7, 9, 4]
但是,我們可以通過在更緊湊的方式編寫這個內置min
功能爲我們找到最小的子表。這裏的訣竅是我們得到min
來調用它自己來找到每個子列表中的最小項,然後使用這些最小值來決定哪個子列表是最小項。
def least(list2d):
minseq = min(list2d, key=min)
x = min(minseq)
print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq))
該版本的效率稍低,因爲它計算了最小項目的最小值兩次。爲了避免我們可以通過min
發電機表達式:
def least(list2d):
x, minseq = min((min(seq), seq) for seq in list2d)
print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq))
即發電機表達創建每個子表的元組和它的最小值,這些元組然後被傳遞到外min
呼叫,以便找到含有最小的最小元組。如果兩個或兩個以上的元組爲最小值匹配,則將元組本身進行比較以決定勝利者。
格式代碼,請 –
您將需要使用**遞歸或堆棧/隊列**。由於列表可能是嵌套的,這意味着您需要搜索項目內的最小項目(可能是另一個類似列表),然後比較所有項目的結果。 –
另外,你總是會有一個層次的嵌套?或者你想支持n維列表? –