【问题标题】:Finding the Minimum and Maximum of a list of values without sorting or using any built in Functions or Libraries在不排序或使用任何内置函数或库的情况下查找值列表的最小值和最大值
【发布时间】:2018-03-28 07:12:46
【问题描述】:

我需要找到值列表中的最小值,但我被禁止使用任何内置函数或库。我可以使用 if else 或 elif ,但仅此而已。

我必须使用基本运算符和(我想?)我自己的直觉来解决这个问题。

不幸的是,我没有那么直观,无论我使用什么 if else 语句或 运算符组合,我都无法让它工作。

我真的是 python 新手,我的老师几乎没有帮助描述如何去做这件事(除了定义运算符。这就是他所做的一切)。

所以基本上我有一个三个整数的列表,我必须找到这三个整数的最小值和最大值(还要找到一些其他的东西,但让我们保持简单)。我必须使用函数来定义整数并使用单独的函数来定义列表的最小值和最大值。

我有定义整数的函数,这很容易,现在我被困在这个:

def determine_min_value(a,b,c):
    print ("The minimum value is {}.".format(c < (b < a)))

a、b 和 c 为变量(num1、num2、num3)

它输出“最小值为 False”。如果 False 是一个非常小的数字,并且也是输入变量之一,那就太好了;显然不是。

我完全清楚 .format(c

我根本不知道从这里去哪里,任何输入将不胜感激。另外我知道您想说“只需将它们放在列表中并使用 min(1)”,但同样,我不被允许。我也愿意这样做。

【问题讨论】:

标签: python function max min minimum


【解决方案1】:

既然你提到了值列表,你可以通过递归来实现

import numpy as np

def mymin(lst):
    if not lst:
        return np.inf 
    head = lst[0]
    tail = mymin(lst[1:])
    return head if head < tail else tail

它的作用

  • 列表的最小值要么是第一个元素,要么是其余元素的最小值
  • 空列表被忽略(具有无限值)

但是,请记住,它在 python 中效率不高

【讨论】:

  • 我认为这个想法不是让它变得高效,而是让它变得很痛苦。
  • @TristanStroud:好的,这个例子就是!
  • 这使用了一个库,这违反了 OP 的要求。
  • @Reti43:我认为这并不违反规则,因为练习的重点显然是想办法实现min
  • 那我们对规则的理解就不一样了,因为OP在第一行声明“我被禁止使用任何内置函数或库”。这是一个迂腐的练习,虽然您不以任何直接方式使用 numpy 来计算最小值/最大值,但如何解释规则取决于老师。
【解决方案2】:

编辑:由于你不能使用 reduce(),你可以对三个整数进行内联操作,如下所示:

maximum = lambda x, y, z: x if x > (y and z) else y if y > z else z
maximum(1, 5, 7)

如果您真的想为了教授而避免使用 lambda,那么您可以传统地编写它:

def maximum (x, y, z):
    if x > y and z:
        return x
    elif y > z:
        return y
    else:
        return z

要在输入规模非常大时扩展上述功能,最好使用名为 reduce 的内置函数来实现(特别是如果您尝试执行除检查 max 或 min 之外的其他操作,这显然是一个内置功能)。

from functools import reduce

def check_greater(a,b):
    if a > b:
        return b
    else:
        return a

number_list = [1,6,3,8,5,78,4,23,9]

minimum = reduce(check_greater, number_list)

这会将 check_greater() 函数应用于列表中的每一对元素,并将不断为每一对返回一个值,对应于较低的值。

将比较前 1 和 6。由于 1 较低,它将代替这两个值返回。现在将比较 1 和 3。同样,由于它较低,因此将返回以替换这两个值。也许我应该在中间的某个地方嵌套 1 以使其更明显,但无论最小值落在数字列表中的哪个位置,reduce 函数都会获取您的整个迭代并根据您传递的函数返回单个值作为第一个参数。

请注意,您可以对最大值执行相同操作,只需在 check_greater() 函数的返回语句中切换 a 和 b。

【讨论】:

  • 抱歉,我不允许使用内置库或函数和 functools 以及 reduce 函数,这违反了这两个限制。我很感激你花时间帮助我解决这个问题。我还要感谢你让我知道这个功能,因为即使我可以使用函数,我也不会想到它。
  • 顶部的答案可能是您可以使用的代码行数最少。第二个函数减少了 gil.fernandes 解决方案的几行。如果你需要对一个可迭代对象做一些复杂的事情,最好使用 reduce,所以我把它留在那里
  • @Reti43 你是对的,我应该使用“and”而不是链接运算符。我已经修复了,谢谢!
  • 直到我弄明白后才看到您的编辑。无论哪种方式都很棒的描述,谢谢!
【解决方案3】:

我工作了一段时间,最终得到了

    # function determines and defines the minimum value
def det_min_value(a,b,c):
    print ("The minimum value is {}.".format(a if (a < b and c)
                                                 else b if (b < c and a)
                                                     else c))
    # for range function 
    return (a if (a < b and c)
                else b if (b < c and a)
                    else c)

效果很好。如果没有这里为我提供的信息,我将无法做到这一点,非常感谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多