在 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