如何比较子列表

2024-06-10 01:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个由子列表组成的列表中找出最小的数字。 程序的输出应该如下所示:

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]

到目前为止,我有一些代码可以在列表中找到最小的数字,并打印出子列表,但如何将它们组合在一起,这是我真正的问题。在

^{pr2}$

“测试”的主体在行之前还是之后

for y in x:

Tags: the代码in程序number列表foris
3条回答

简洁明了:

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

如果您想知道最小值的来源,只需创建一个循环:

^{pr2}$

全部功能:

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

假设子列表只有一个级别的深度,您可以通过维护一个包含最小值的变量来完成此操作,另一个变量用于跟踪包含该值的列表:

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))

Python有一个built-in ^{} 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)

输出

^{pr2}$

但是,我们可以使用内置的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调用,以便找到包含最小最小值的元组。如果两个或两个以上的元组并列为最小值,则比较这些元组本身以决定胜出者。在

相关问题 更多 >