我有一个名为lon_list的列表,其中包含许多从0到360的浮点值。我有兴趣从列表中大于或等于180的任何浮点数中减去360。我该怎么做?
这是我目前的尝试:
for x in lon_list:
if x>=180:
x-360
lon_list
答案 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)