如何修改浮动列表的一部分?

时间:2019-07-24 15:07:07

标签: python python-3.x

我有一个名为lon_list的列表,其中包含许多从0到360的浮点值。我有兴趣从列表中大于或等于180的任何浮点数中减去360。我该怎么做?

这是我目前的尝试:

for x in lon_list:
   if x>=180:
      x-360
lon_list

5 个答案:

答案 0 :(得分:1)

尝试一下:

lon_list = [12, 13.50, 183.54, 205.80]
lon_list = [x-360 if x>= 180 else x for x in lon_list]
print(lon_list)

输出

[12, 13.5, -176.46, -154.2]

答案 1 :(得分:1)

您可以简单地使用列表理解来创建具有所需更改的新列表:

lon_lis = [x if x < 180 else x - 360 for x in lon_lis]

答案 2 :(得分:0)

如果您无法使用numpy,则可以使用enumerate

for index, val in enumerate(lon_list):
    if val >= 180.0:
        lon_list[index] -= 360.0

如果您可以使用numpy,则可以执行类似lon_list[lon_list >= 180.0] -= 360.0

的操作

答案 3 :(得分:0)

就地修改列表:

for i in range(len(lon_list))
    if lon_list[i] >= 180:
        lon_list[i] -= 360

列表理解解决方案比在适当位置修改列表要快。但是,如果对列表有其他引用,则有必要在适当位置修改列表。这是一个简单的基准,大约需要更新82%的列表元素,这有利于列表理解解决方案。

from random import uniform
from time import time

the_list = [uniform(1.0, 1000.0) for i in range(1000)]

N_TRIALS = 10000

def test_1():
    t1 = time()
    for trial in range(N_TRIALS):
        lon_list = the_list[0:]
        for i in range(len(lon_list)):
            if lon_list[i] >= 180:
                lon_list[i] -= 360
    t2 = time()
    print("running time for test_1:", t2 - t1)



def test_2():
    t1 = time()
    for trial in range(N_TRIALS):
        lon_list = the_list[0:]
        lon_list = [x if x < 180 else x - 360 for x in lon_list]
    t2 = time()
    print("running time for test_2:", t2 - t1)

if __name__ == '__main__':
    test_1()
    test_2()

test_1的运行时间:1.3320763111114502

test_2的运行时间:0.8780503273010254

修改上述基准,以便仅需要修改10%的元素时,我们得到:

test_1的运行时间:0.7290420532226562

test_2的运行时间:0.603034257888794

当不需要修改任何元素时:

test_1的运行时间:0.6360366344451904

test_2的运行时间:0.5660324096679688

答案 4 :(得分:0)

许多现代语言都支持映射,过滤和归约功能。这种方法会更熟悉,并且可以在其他语言中使用。

recalculated = map(lambda x: x-360 if (x >= 180) else x, lon_list)

map(function, iterable)根据提供的函数将可迭代对象中的所有值(如列表和元组)重新映射到新集合。

在这种情况下,该函数接受一个参数并返回结果。

lambda x: ...是一个匿名函数。基本上,该函数是在表达式中声明的。

如果愿意,可以单独声明该函数,然后在map中使用它。

def calc(x):
    return x-360 if (x >= 180) else x

recalculated = map(calc, lon_list)

https://docs.python.org/3/library/functions.html#map