取数字列表的绝对值

Taking absolute values of a list of numbers

我在 Stock 中检查过类似的分支,但是都使用了一些准备好的库;这不是我想要的。

我想创建一个函数,它接受一个数字列表,获取它们的绝对值并打印修改后的列表。这是我的代码:

def abs(array):
    for member in array:
        if member < 0:
            member = member * (-1)
        else:
            member = member

    print(array)

但它会打印原始列表。例如:

abs([1, -34, 23, 2342, 52, -3, -12, -123, -23])

给出:

[1, -34, 23, 2342, 52, -3, -12, -123, -23]

Process finished with exit code 0

 

问题出在您使用的循环上,尝试以这种方式修改它

def abs1(array):
    for i in range(len(array)):
        if array[i] < 0:
             array[i] = array[i] * (-1)
    print(array)

原因是您之前使用的循环只是为了 访问列表元素但没有给您参考以更改列表中的任何内容我使用列表上的索引解决了它。

你的代码有两个错误:

  1. abs 是一个预先存在的 Python 函数。永远不要用一个已经存在的函数来命名你自己的函数;它可能会导致意外行为。

  2. 您不应该修改函数中的参数。相反,创建一个新数组并 return 它。

下面是更正后的代码:

def list_abs(array):
    new_array = []
    for member in array:
        if member < 0:
            new_array.append(member * (-1))
        else:
            new_array.append(member)
    return new_array

array = [2, 3, 4, -5, -6, 7, -8]
print(list_abs(array))
# Prints [2, 3, 4, 5, 6, 7, 8]

尝试:

import numpy as np

array= ...

np.abs(np.array(array))

numpy非常强大而且速度很快,尽快学会使用。

编辑,因为问题是如何对列表的每个元素执行函数并将这些结果包装在相同长度的列表中:

想到了两个解决方案:

  • 硬核python风格:
[x if x<0 else -x for x in array]

方括号说我想要一个列表,在里面我写了函数,我说在哪里可以找到我的函数的参数。

[abs(x) for x in array]
[f(x) for x in array] # for any defined f that can handle every element of array
  • map(lambda x : f(x), 数组)

您在数组的元素上创建了一个映射。对于这些元素,您应用 lambda。 lambda 是一种在本地定义函数的方法,非常本地化。

list(map(lambda x : abs(x),array))

最后,您从映射中创建了一个列表,以检索结果。如果你不这样做,它将保持抽象,即数组与尚未实例化的事物之间关系的定义。

在Python中,如果您以这种方式使用for,则不会将值分配到数组中。 试试这个代码。

def abs(array):
for i in range(len(array) - 1):
    if array[i] < 0:
        array[i] = array[i] * (-1)

print(array)