2017-02-13 121 views
1

我試圖從列表中找出列表中最小的數字。 該程序的輸出應該是這樣的:如何比較子列表

least([[2,4,3],[1,7,9,4]]) 
in [[2,4,3],[1,7,9,4]] the least number is 1 found in sublist [1,7,9,4] 

到目前爲止,我有一個發現列表中最小的數字代碼,並打印出的子列表,但我怎麼一起將它們組合起來,這真是我的問題。

# finds smallest number in list 
def test(list1): 
    x = list1[0] 
    for i in list1: 
     if i < x: 
      x = i 
    print(x) 

# prints out sublists 
def test2(num): 
    for x in num: 
     for y in x: 
      print (y, end = " ") 
     print("") 

是否之前或線路

for y in x: 
+1

格式代碼,請 –

+0

您將需要使用**遞歸或堆棧/隊列**。由於列表可能是嵌套的,這意味着您需要搜索項目內的最小項目(可能是另一個類似列表),然後比較所有項目的結果。 –

+0

另外,你總是會有一個層次的嵌套?或者你想支持n維列表? –

回答

4

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呼叫,以便找到含有最小的最小元組。如果兩個或兩個以上的元組爲最小值匹配,則將元組本身進行比較以決定勝利者。

1

假設子列表是深只有一個級別,你可以通過維持含有看到的最值的變量做到這一點後,「測試」去身體,而另一個保持包含該值曲目列表:

lists = [[2, 4, 3], [1, 7, 9, 4]] 

min_list = None 
min_value = lists[0][0] # initialse to the first item of the first list 

for sublist in lists: 
    min_ = min(sublist) 
    if min_ < min_value: 
     min_value = min_ 
     min_list = sublist 

print("the least number is {} found in sublist {}".format(min_value, min_list)) 
+0

您最初的假設是不正確的基礎上作出澄清@MadPhysicist澄清已進一步明確意見 –

+0

。 ;) –

+0

所以它。這裏有一個命名碰撞的位 –

0

短而簡單:

>>> lst = [[2, 4, 3], [1, 7, 9, 4]] 
>>> min_value_in_lst = min(min(sublist) for sublist in lst) 
1 

如果你想知道的是最小值是從哪裏來的,只是簡單的創建一個循環:

for sublist in lst: 
    if min_value_in_lst in sublist: 
     return sublist 

的全部功能:

def least(lst): 
    min_value_in_lst = min(min(sublist) for sublist in lst) 
    that_sublist = None 

    for sublist in lst: 
     if min_value_in_lst in sublist: 
      that_sublist = sublist 
      break 

    # print out the result 
0

如果您需要Python的方式來處理,那就試試這個簡單的代碼: -

a = [[2,4,3],[1,7,9,4]] 
min(reduce(lambda x,y : x+y, a)) 

Output:- 
1 
+0

這並不能識別包含最小項目的子列表。 –