问题描述
我正在尝试从子列表组成的列表中找到最小的数字。 程序的输出应如下所示:
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楼
Python具有 。 但是我想编写自己的东西是一个很好的学习练习。
我们可以编写一个函数,通过创建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
调用,以查找包含最小最小值的元组。
如果2个或更多的元组并列最少,则比较元组本身以决定获胜者。
2楼
假设子列表仅深一层,您可以通过维护一个包含最小可见值的变量来完成此操作,并通过另一个变量来跟踪包含该值的列表:
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))
3楼
简短:
>>> 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
4楼
如果您需要使用pythonic方式进行处理,请尝试以下简单代码:-
a = [[2,4,3],[1,7,9,4]]
min(reduce(lambda x,y : x+y, a))
Output:-
1