![](/img/trans.png)
[英]Return all pairs of integers from a given list of integers that have a difference of 2
[英]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.