2017-02-13 37 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

这并不能识别包含最小项目的子列表。 –