在 Python 的列表中使用 abs()
Using abs() in a list in Python
我正在尝试创建一个整数列表,然后扫描它以找到列表元素减法的最小绝对值。我已经创建了列表,但是在找到最小绝对值的代码中存在问题,因为它显示的结果不正确。我认为它可能在循环期间位于列表元素的位置。你能帮我找到吗?
比如我创建一个列表Α = [2, 7, 5, 9, 3, 1, 2]
时,min
的结果应该是0,但结果是1。
这是我的代码:
min=1000
for i in range (1, N-1):
for j in range (i+1, N):
if (abs (A [i-1] - A [j-1])<min):
min = abs (A [i-1] - A [j-1])
print ("%d" %min)
这就是您要查找的内容:
A = [2, 7, 5, 9, 3, 1, 2]
diffs = []
for index1, i in enumerate(A):
for index2, j in enumerate(A):
if index1 != index2:
diffs.append(abs(i-j))
print(min(diffs))
输出:
0
已更新以排除相同项目的减法
你可以这样做:
A = [2, 7, 5, 9, 3, 1, 2]
temp = sorted(A)
min_diff = min([abs(i - j) for i, j in zip(temp [:-1], temp [1:])])
print(min_diff) # -> 0
排序确保产生整体差异最小的元素对 (i, j)
将是一对连续的元素。这使得
与 所有 种可能组合的蛮力方法相比,您必须执行的检查次数要少得多。
比短路更聪明的东西:
A = [2, 7, 5, 9, 3, 1, 2]
def find_min_diff(my_list):
if len(set(my_list)) != len(my_list): # See note 1
return 0
else:
temp = sorted(my_list)
my_min = float('inf')
for i, j in zip(temp [:-1], temp [1:]):
diff = abs(i - j)
if diff < my_min:
my_min = diff
return my_min
print(find_min_diff(A)) # -> 0
备注:
1:转换为集合会删除重复项,因此如果相应集合的元素少于原始列表,则意味着至少有一个重复值。但这必然意味着最小绝对差为 0,我们不必再看下去了。
我敢打赌,这是所有 return 0.
列表中最快的方法
这是一个蛮力解决方案:
from itertools import combinations
A = [2, 7, 5, 9, 3, 1, 2]
min(abs(i-j) for i, j in combinations(A, 2)) # 0
使用 numpy
import numpy as np
A = [2, 7, 5, 9, 3, 1, 2]
v = np.abs(np.diff(np.sort(np.array(A))))
np.min(v)
输出:0
或者你可以像这样只对 diff 部分使用 numpy :
v = min(abs(np.diff(sorted(A))))
您不应该在内循环中从 j 中减去 1,因为您最终会跳过最后一个 2
的比较。最好在循环范围内进行调整,而不是在循环代码中减去(或不减去):
A = [2, 7, 5, 9, 3, 1, 2]
N = 7
mint = 1000
for i in range (0, N-1):
for j in range (i+1, N):
if (abs(A[i] - A[j]) < mint):
mint = abs(A[i] - A[j])
print(i, j)
print(mint)
print(mint) # 0
我也避免使用内置函数名称 min
。
为了避免任意的、神奇的数字 1000,您可以针对 None
:
执行初始检查
A = [2, 7, 5, 9, 3, 1, 2]
N = 7
mint = None
for i in range (0, N-1):
for j in range (i+1, N):
if mint is None:
mint = abs(A[i] - A[j])
elif (abs(A[i] - A[j]) < mint):
mint = abs(A[i] - A[j])
print(i, j)
print(mint)
print(mint) # 0
我正在尝试创建一个整数列表,然后扫描它以找到列表元素减法的最小绝对值。我已经创建了列表,但是在找到最小绝对值的代码中存在问题,因为它显示的结果不正确。我认为它可能在循环期间位于列表元素的位置。你能帮我找到吗?
比如我创建一个列表Α = [2, 7, 5, 9, 3, 1, 2]
时,min
的结果应该是0,但结果是1。
这是我的代码:
min=1000
for i in range (1, N-1):
for j in range (i+1, N):
if (abs (A [i-1] - A [j-1])<min):
min = abs (A [i-1] - A [j-1])
print ("%d" %min)
这就是您要查找的内容:
A = [2, 7, 5, 9, 3, 1, 2]
diffs = []
for index1, i in enumerate(A):
for index2, j in enumerate(A):
if index1 != index2:
diffs.append(abs(i-j))
print(min(diffs))
输出:
0
已更新以排除相同项目的减法
你可以这样做:
A = [2, 7, 5, 9, 3, 1, 2]
temp = sorted(A)
min_diff = min([abs(i - j) for i, j in zip(temp [:-1], temp [1:])])
print(min_diff) # -> 0
排序确保产生整体差异最小的元素对 (i, j)
将是一对连续的元素。这使得
与 所有 种可能组合的蛮力方法相比,您必须执行的检查次数要少得多。
比短路更聪明的东西:
A = [2, 7, 5, 9, 3, 1, 2]
def find_min_diff(my_list):
if len(set(my_list)) != len(my_list): # See note 1
return 0
else:
temp = sorted(my_list)
my_min = float('inf')
for i, j in zip(temp [:-1], temp [1:]):
diff = abs(i - j)
if diff < my_min:
my_min = diff
return my_min
print(find_min_diff(A)) # -> 0
备注:
1:转换为集合会删除重复项,因此如果相应集合的元素少于原始列表,则意味着至少有一个重复值。但这必然意味着最小绝对差为 0,我们不必再看下去了。
我敢打赌,这是所有 return 0.
列表中最快的方法这是一个蛮力解决方案:
from itertools import combinations
A = [2, 7, 5, 9, 3, 1, 2]
min(abs(i-j) for i, j in combinations(A, 2)) # 0
使用 numpy
import numpy as np
A = [2, 7, 5, 9, 3, 1, 2]
v = np.abs(np.diff(np.sort(np.array(A))))
np.min(v)
输出:0
或者你可以像这样只对 diff 部分使用 numpy :
v = min(abs(np.diff(sorted(A))))
您不应该在内循环中从 j 中减去 1,因为您最终会跳过最后一个 2
的比较。最好在循环范围内进行调整,而不是在循环代码中减去(或不减去):
A = [2, 7, 5, 9, 3, 1, 2]
N = 7
mint = 1000
for i in range (0, N-1):
for j in range (i+1, N):
if (abs(A[i] - A[j]) < mint):
mint = abs(A[i] - A[j])
print(i, j)
print(mint)
print(mint) # 0
我也避免使用内置函数名称 min
。
为了避免任意的、神奇的数字 1000,您可以针对 None
:
A = [2, 7, 5, 9, 3, 1, 2]
N = 7
mint = None
for i in range (0, N-1):
for j in range (i+1, N):
if mint is None:
mint = abs(A[i] - A[j])
elif (abs(A[i] - A[j]) < mint):
mint = abs(A[i] - A[j])
print(i, j)
print(mint)
print(mint) # 0