有条件地乘以列表python

时间:2018-02-04 19:20:33

标签: python database math

我必须将列表(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。

所以这是一个小小的改进,但不是很大。我必须多次迭代执行此任务,并需要进行重大改进......

2 个答案:

答案 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])