我正在编写一个函数,该函数返回大于列表中某个值的数字的最小值。例如,如果给定的值是[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'对象不可迭代”
答案 0 :(得分:3)
您的while
循环将变为无限循环,除非seq
中的每个数字都大于value
(这是发生的情况,因为i
永远不会超过{{1} })
此外,递增len(seq)
的结果是数量大于value的数量,而不是精确地给出最小的索引。
您可以使用列表理解功能在一行中完成此操作:
i
输出:
min(i for i in [1,2,3,4,5] if i > 3)
答案 1 :(得分:0)
证明您获得了无序的数字列表,那么您需要首先对列表进行排序。
在您的代码上,如果您将smallest_greater
中的>
切换为<=
,则第一个if seq[i] > value:
应该可以工作。但是,返回值不应为min(seq[i])
,而应仅为seq[i]
。对于另一个问题,问题是您用value
覆盖了for loop
的值,导致代码失败。
修复您的第一个功能后,您将获得一个具有以下功能的代码:
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
答案 2 :(得分:0)
您的代码取至少一个值,而应取最小的过滤列表。首先用满足条件的期望值填充另一个列表,然后取最小值:
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 :(得分:0)
seq.sort()
i = seq.index(value)
if (i < seq.size() - 1):
return seq[i+1]
else return seq[i]
排序数组,找到值的索引,列表中的下一个值将比您的值最小。 if语句检查您的值是否在数组中最大
答案 4 :(得分:0)
排序和最小都使用额外的循环。您可以在一个循环中完成操作以获得更好的性能
k = 3
x = None
for item in a:
x = item if item > k and (x is None or x > item) else x
现在,如果没有其他任何元素,则x中具有最小的较大元素