![](/img/trans.png)
[英]Efficiently delete arrays that are close from each other given a threshold in python
[英]check if 2 given number are close to each other python
我被要求制作沒有循環的代碼並檢查第一個數字是否接近第二個數字(接近意味着更大或更小一個)。我嘗試使用巨大的條件,但我想也許有一種更簡單的方法然后做事像這樣:
如果 num1 == num2 或 num1 == num2 - 1 或 num1 == num2 + 1
計算兩個數字之間的差,取其絕對值(如果num2
大於num1
)並將結果與 1 進行比較:
abs(num1 - num2) <= 1
這比 OP 的代碼的優勢
適用於浮點數。 Ex 1 和 1.4 將在原始代碼中失敗,但在此成功。
容易改變“接近”的定義。 例如,可以在 rhs 上使用 0.5 或 10000000。
沒有將此視為解決方案,所以我正在添加它。
使用 Python 3.5 中引入的math.isclose()
方法和PEP 458
:
#Function signature defined as
math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
所以:
math.isclose(a,b,rel_tol=1)
雖然這對於 OP 的確切用例來說有點矯枉過正,但這是執行檢查的最 Pythonic 方式。 此外,根據文檔,這可以處理NaN
和+/- inf
值。
NaN、inf 和 -inf 的 IEEE 754 特殊值將根據 IEEE 規則進行處理。 具體來說,NaN 不被視為接近任何其他值,包括 NaN。 inf 和 -inf 僅被視為接近它們自己。
我喜歡介紹 3 個執行類似近似但使用列表的函數:
def closest(lst, K):
return lst[min(range(len(lst)), key=lambda i: abs(lst[i]-K))]
為了理解上層函數,這個下一個函數類似:
def closest(lst, K):
minim = None
for i in lst:
aux = abs(i - K)
if minim is None:
minim = aux
result = i
if aux < minim:
minim = aux
result = i
return result
使用 numpy 庫:
import numpy
def closest(lst, K):
lst = numpy.asarray(lst)
idx = (numpy.abs(lst - K)).argmin()
return lst[idx]
您可以使用如下示例調用上層函數:
lst = [2.4, 3.2, 6.9, 7.2, 9.8]
K = 5.1
print(closest(lst, K))
注意:如果數字正好在中間,則函數取最小值。
這個答案是基於約翰尼莫普的答案的想法並對其進行概括。
對於“關閉”的任意定義(例如“不超過 10 個設備”),我們可以采用三個參數並返回一個布爾值:
def isInRange(value1, value2, maxCloseness):
difference = abs(value1 - value2)
return difference <= maxCloseness
或作為單行:
def isInRange(value1, value2, maxCloseness):
return abs(value1 - value2) <= maxCloseness
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.