【问题标题】:Finding the smallest element greater than a given value in a list在列表中查找大于给定值的最小元素
【发布时间】:2019-08-27 13:58:03
【问题描述】:

我正在编写一个函数,它返回大于列表中某个值的数字的最小值。例如,如果给定值是 [1,2,3,4,5] 中的 3,它应该返回 4。但是,我的尝试都没有奏效。

我使用了'min'函数,并尝试了while和for循环来解决问题。

def smallest_greater(seq, value):
    i = 0
    while i < len(seq):
        if seq[i] > value:
            i = i + 1
    return min(seq[i])

def smallest_greater(seq, value):
    i = 0
    for value in seq:
        if seq[i] > value:
            i = i + 1
    return min(seq[i])

如果我尝试使用 while 循环运行代码,它不会执行代码。如果我使用 for 循环运行代码,它会给出“TypeError:'int' object is not iterable”

【问题讨论】:

  • seq[i] 是单个值,因此 min(seq[i]) 没有意义(并且失败)。
  • 在第一个中,你有一个无限循环,因为你不会每次都增加 i。

标签: python math


【解决方案1】:

您的while 循环将无限循环,除非seq 中的每个数字都大于value(这是正在发生的事情,因为i 永远不会超过len(seq)

此外,增加i 是在进行大于值的数字计数,而不是准确地给出最小更大的索引。

你可以用列表理解在一行中做到这一点:

min(i for i in [1,2,3,4,5] if i > 3)

输出:

4

【讨论】:

    【解决方案2】:

    您的代码至少采用一个值,而不是应该采用过滤列表中的最小值。首先用满足条件的所需值填充另一个列表,然后取最小值:

    In [3]: def smallest_greater(seq, value):
       ...:     lst = []
       ...:     for s in seq:
       ...:         if s > value:
       ...:             lst.append(s)
       ...:     return min(lst)
    
    
    In [4]: smallest_greater([1, 2, 3, 4, 5, 6], 5)
    Out[4]: 6
    
    In [5]: smallest_greater([1, 2, 3, 4, 5, 6], 3)
    Out[5]: 4
    

    【讨论】:

      【解决方案3】:
      seq.sort()
      i = seq.index(value)
      if (i < seq.size() - 1):
          return seq[i+1]
      else return seq[i]
      

      排序数组,找到值的索引,列表中的下一个值将是最小的大于你的值。 if 语句检查你的值是否是数组中最大的

      【讨论】:

      • 当列表中没有value时会返回ValueError...
      • @SeraphWedd "例如,如果给定的值是 [1,2,3,4,5] 中的 3,它应该返回 4" 我以为我们正在寻找列表中的值.
      【解决方案4】:

      sorted 和 min 都使用额外的循环。你可以在一个循环中完成它以获得更好的性能

      k = 3
      x = None
      for item in a:
          x = item if item > k and (x is None or x > item) else x
      

      现在你有 x 中最小的更大元素,如果还有其他没有的话

      【讨论】:

        【解决方案5】:

        证明给你一个无序列的数字列表,那么你需要先对列表进行排序。

        在您的代码中,如果您在if seq[i] &gt; value: 中将&gt;&lt;= 切换,则第一个smallest_greater 应该可以工作。但是,返回值不应该是min(seq[i]),而应该只是seq[i]。对于另一个问题,问题是您正在用 for loop 覆盖 value 的值,从而导致您的代码失败。

        修复你的第一个函数,你将有一个工作代码:

        def smallest_greater(seq, value):
            seq.sort()
            i = 0
            while i < len(seq):
                if seq[i] <= value:
                    i = i + 1
                else: return seq[i]
        

        这应该会提供您想要的输出。

        编辑:

        如果我要这样做,那将是:

        def smallest_greater(seq, value):
            try:
                return min(x for x in seq if x > value)
            except ValueError:
                return None
        

        【讨论】:

        • 可能想运行一下看看
        • 并排序,因为你依赖它,虽然会提高时间复杂度,所以不推荐
        • 是的。我只是想纠正他的代码。如果我要这样做,那么无论顺序如何,我都可以使用:print(min([x for x in seq if x > value]))
        • 最好使用生成器:min(x for x in seq if x &gt; value)。您不需要构建整个列表。
        猜你喜欢
        • 2013-09-09
        • 2021-10-10
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多