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维列表? –