返回列表列表中的最小错误

时间:2016-10-08 02:27:59

标签: function

尝试在此函数中返回最小值,但我不断收到错误“TypeError:my_min()需要1个位置参数,但是给出了3个。”关于我需要改变什么的建议?

def my_min(xss):
    min = xss[0] 
    for i in xss:
        if i < min:
            min = i
    return min

4 个答案:

答案 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]])