在Python的列表中使用abs()

Mik*_*son 3 python loops for-loop list absolute-value

我试图创建一个整数列表,然后扫描它,以找到列表元素的减法的最小绝对值.我已经创建了列表,但是代码中存在找到最小绝对值的问题,因为它显示的结果不正确.我认为这可能是在循环期间列表元素的可能性.你能帮我找到吗?

例如,当我创建一个列表时? = [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)
Run Code Online (Sandbox Code Playgroud)

Ev.*_*nis 5

你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

排序确保(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
Run Code Online (Sandbox Code Playgroud)

笔记:

1:转换为set将删除重复项,因此如果相应的集合的元素少于原始列表,则表示至少有一个重复值.但这必然意味着最小绝对差值为0,我们不必再看了.

我愿意打赌,这是所有返回0的列表的最快方法.

  • "因此,您可以只遍历一次而不是两次." 我发现这有点误导,因为这不会降低从O(2n)到O(n)的复杂性,而是从O(n²/ 2)到O(nlogn + n) (3认同)