簡體   English   中英

比較列表中的整數與給定值的差異

[英]Comparing the difference of integers in a list with a given value

我的Python有點生疏,我真的遇到了這個超級簡單算法的麻煩。

我正在嘗試編寫一個函數,它接受兩個參數(目標,值)來查找值中哪個數字最接近目標數字; 如果碰巧有平局,那么選擇較低的數字。

這是我的進步,但我只選擇了較低的數字,而沒有實際比較列表中的值與目標的相對距離的差異。

所以,實質上,我的功能實際上並沒有完全正確地完成挑戰,因為47實際上接近46而不是31; 但是,如果列表中包含的數字假設為45和47,那么它們將與我的目標數量相等,因此應該打印45而不是47。

我更喜歡使用簡單的/ if / while循環的答案,這樣我才能真正練習我的技能。

其他更高級的答案也歡迎詳細解釋。

編輯

你們的一些非常好的答案,非常感謝; 我正在測試它們,並且會選擇最適合我風格的一個,並使用其余的作為參考,即使你有最好的單行答案。

target = 46
values = [1, 22, 31, 47, 87, 99]

def closest_to_target(target, values):

    lower = []

    for number in values:
        if number < target:
            lower.append(number)

    if lower:
        lowest = sorted(lower, reverse=True)[0]
        return lowest

    else:
        return "Error handling array"


print closest_to_target(target, values)

您只選擇小於目標的數字,而不管它們之間的差異。 對於您請求的基本代碼示例,您需要考慮對線性搜索進行修改,但只需跟蹤最低差異和產生此最小差異的值。

    def closest(target, values):
        smallest_difference = #a really large value to start
        closest_number = None
        for number in values:
            diff = abs(number - target)
            if diff == smallest_difference and number < closest_number:
               closest_number = number
            if diff < smallest_difference:
               closest_number = number
               smallest_difference = diff
        return closest_number

此方法的優點是您不創建其他列表。

您可以使用以下函數創建值的元組,以及該值與目標值的接近程度。 通過這個元組排序,您不僅可以獲得最接近目標值的元素,而且在綁定的情況下,將選擇最小的綁定值。

target = 46
values = [1, 22, 31, 47, 87, 99]

def closest_min(l, t):
  return sorted([(abs(t-i), l[e]) for e, i in enumerate(l)])[0][1]

print(closest_min(values, target))

輸出:

47

在平局的情況下,將正確選擇最低:

>>> closest_min([47, 45], 46)
45

使用min()稍微整潔的版本:

def closest_min(l, t):
      return min(l, key=lambda x:(abs(x-t), x))

這可以一次完成,跟蹤增量。 如果delta等於前一個delta,則最接近的是前一個最近和當前的min。 如果delta較小,則使用當前值更新delta和最接近的delta。 別的,繼續前進。

>>> target = 46
>>> values = [1, 22, 31, 47, 87, 99]
>>> closest = values[0]
>>> delta = abs(target - closest)
>>> for x in values:
...     d = abs(target - x)
...     if d == delta:
...         closest = min(closest, x)
...     elif d < delta:
...         delta = d
...         closest = x
...
>>> delta
1
>>> closest
47
>>>
def min_dist_index(target, values):
    values = sorted(values)
    dists = [abs(target-value) for value in values]
    index = dists.index(min(dists))
    return values[index]

target = 46
values = [1, 22, 31, 47, 87, 99]
print(min_dist_index(target, values))

產量: 47

您可以生成一個有效數字列表,然后可以使用所謂的列表理解進行處理:

values[[abs(target-i) for i in values].index(min([abs(target-i) for i in values]))]

這里列表literal []用於定義通用算法,而不是列表內容應該是特定值。 列表中的每個元素i都是從包含您的值的列表文字派生的,並根據目標編號進行檢查。 如果它們不符合條件,則它們不包含在新生成的列表中。

執行:

#!/usr/bin/env python

target = 46
values = [1, 22, 31, 47, 87, 99]


def closest_to_target(target, values):
    lower = values[[abs(46-i) for i in values].index(min([abs(46-i) for i in values]))]
    return lower

print(closest_to_target(target, values))

哪個會打印:

47

暫無
暫無

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

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