我必须将列表(a)与另外两个列表(b和c)中的一个相乘,但条件是(a)中的值是正还是负。
我确实有一个可行的解决方案,但速度很慢,我想加快速度。 我相信R中的this代码是我需要的,但不知道Python中的类似方法。
修改
我已经应用了Moinuddin Quadri的方法:
amount = [0,1,0,0,-1,0,1,-1,1]
data1 = [10,11,12,13,14,15,16,15,14]
data2 = [3,1,2,3,4,5,6,5,4]
flow2 = [(i*j if i > 0 else i*k) for i, j, k in zip(amount, data1, data2)]
100000个循环,最佳3:每循环2.35μs
而我自己的尝试:
amount = [0,1,0,0,-1,0,1,-1,1]
data1 = [10,11,12,13,14,15,16,15,14]
data2 = [3,1,2,3,4,5,6,5,4]
flow = [0]*len(data1)
for i in range(len(data1)):
if amount[i] > 0:
flow[i] = amount[i]*data1[i]
else:
flow[i] = amount[i]*data2[i]
100000个循环,最佳3:每循环2.97μs。
所以这是一个小小的改进,但不是很大。我必须多次迭代执行此任务,并需要进行重大改进......
答案 0 :(得分:4)
更好的方法是使用列表理解(有条件检查)和zip
:
>>> a = [1, -3, 2, -5, 5, 6, -8]
>>> b = [1, 3, 5, 7, 9, 11, 13]
>>> c = [2, 4, 6, 8, 10, 13, 14]
>>> [(i*j if i > 0 else i*k) for i, j, k in zip(a, b, c)]
[1, -12, 10, -40, 45, 66, -112]
答案 1 :(得分:1)
不确定这会有多大改进,但您可以将原来的方法缩短为:
amount = [0,1,0,0,-1,0,1,-1,1]
data1 = [10,11,12,13,14,15,16,15,14]
data2 = [3,1,2,3,4,5,6,5,4]
flow = []
for idx,num in enumerate(amount):
flow.append( num *data1[idx] if num > 0 else num * data2[idx])