簡體   English   中英

在列表中查找大於給定值的最小元素

[英]Finding the smallest element greater than a given value in a list

我正在編寫一個函數,該函數返回大於列表中某個值的數字的最小值。 例如,如果給定的值是[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'對象不可迭代”

您的while循環將變為無限循環,除非seq每個數字都大於value (這是發生的情況,因為i永遠不會超過len(seq)

此外,遞增i對大於value的數字進行計數 ,而不是恰好給出大於最小的索引。

您可以使用列表理解功能在一行中完成此操作:

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

輸出:

4

事實證明,您將獲得無序的數字列表,那么您需要首先對列表進行排序。

在代碼上,如果在if seq[i] > value:中用<=切換> ,則第一個smallest_greater應該可以工作。 但是,返回值不應為min(seq[i]) ,而應僅為seq[i] 對於另一個問題,問題是您用for loop覆蓋了value的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

您的代碼至少要取一個值,而應該取最小的過濾列表。 首先用滿足條件的期望值填充另一個列表,然后取最小值:

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
seq.sort()
i = seq.index(value)
if (i < seq.size() - 1):
    return seq[i+1]
else return seq[i]

對數組進行排序,找到值的索引,列表中的下一個值將比您的值最小。 if語句檢查您的值是否在數組中最大

排序和最小都使用額外的循環。 您可以在單個循環中完成操作以獲得更好的性能

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

現在,如果有其他元素,則x中具有最小的更大元素

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM