尝试在此函数中返回最小值,但我不断收到错误“TypeError:my_min()需要1个位置参数,但是给出了3个。”关于我需要改变什么的建议?
def my_min(xss):
min = xss[0]
for i in xss:
if i < min:
min = i
return min
答案 0 :(得分:2)
您需要将内容包装在另一个列表中[[2,3],[],[4,1,-5]]
。因此你的函数调用应该是:
my_min([[2,3],[],[4,1,-5]])
您收到此错误是因为没有将这些错误包装到list
,这些错误被视为函数的三个独立参数。但是你的函数被定义为只接受一个。
在列表列表中找到最小数量的最简单方法是使用min
函数:
def my_min(xss):
return min([min(item) for item in xss if item])
答案 1 :(得分:1)
正如我在评论中提到的,你的第一个问题是当你将它作为列表列表调用时,你用三个列表调用你的方法。更明确一点,你应该打电话给:
my_min([[2,3],[],[4,1,-5]])
现在,您面临的下一个问题是您只是遍历列表的第一级。这是不正确的。你必须意识到你有一个列表清单。因此,要坚持解决方案中的逻辑,您需要在for循环内再次迭代,以找到列表中每个列表的最小值。您的min_val
(我更改了名称,因为它会影响内置的min
)
def my_min(xss):
min_val = None
# iterate over the first loop
for i in xss:
# i now is each sublist in your list
for j in i:
if min_val is None or j < min_val:
min_val = j
return min_val
print(my_min([[], [2,3],[],[4,1,-5]]))
结果 - &gt; -5
根据Blckknght的评论,您实际上仍然可以通过声明*
来传递三个单独的列表,在这种情况下,这是一个解包参数。所以:
def my_min(*xss)
如果你像原来那样通过单独的列表,它会起作用,你最终会得到一个列表元组。解决方案不会改变,它只是添加了以您最初的方式传递给您的方法的能力。 Here是关于参数解包的文档。
答案 2 :(得分:0)
您的函数只接受一个参数,您可以使用逗号
的多个参数my_min(a,b,c) #takes 3 arguments instead of one
如果要测试不同测试用例的功能,可以多次调用该函数
my_min([2,3])
my_min([])
my_min([4,1,-5])
如果您希望这样做,也可以使用列表中的列表
答案 3 :(得分:0)
正如其他人所提到的,首先要做的是通过像这样包装输入来传递my_min列表:
my_min([[2,3],[],[4,1,-5]])
然后,你需要做的是递归地找到min。我还添加了一个空列表检查
from math import inf
def my_min(xss):
if not xss:
return inf
min = inf
for i in xss:
if isinstance(i, list):
i = my_min(i)
if i < min:
min = i
return min
my_min([[2,3],[],[4,1,-5]])