使用两个不同的列表应用公式

时间:2016-05-28 10:53:57

标签: python list python-2.7 math formula

我有两个这样的列表:

listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]

我必须在列表中应用此公式:

n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2

'n'是listA的元素,'x'是与listB中'n'的相同索引对应的元素。

我需要将此公式应用于两个列表中的所有元素。因此,当循环第一次运行时,它需要执行此操作:

51/pi*((1*0.1)+1)**2 - pi *(1*0.1)**2

对于第二个,它需要这样做:

988/pi*((2*0.1)+1)**2 - pi*(2*0.1)**2

它会重复,直到两个列表结束。

我知道我必须使用'for'循环,但我的问题是我不知道如何从第二个列表中获取元素。我正在尝试这样做:

for n in listA:
   n/pi*((......))

在括号内,它应该是listB中的元素,但我不知道如何获取它们,并且它们需要与listA中的元素具有相同的索引。 输出应该是第三个列表,其中应用了每个公式的结果。

我试图以最好的方式解释自己,但如果你不理解我的问题,请随意提出任何问题。

提前致谢。

4 个答案:

答案 0 :(得分:5)

我假设两个列表始终具有相同的大小,大多数pythonic方式是使用lambda和list comprehensions:

listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]

from math import pi

formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2

res = [ formula(a,b) for a,b in zip(listA,listB) ]

>> [19.621466242038217,
 452.96994140127384,
 718.7747248407644,
 1289.7268993630569,
 1329.8678662420382,
 2575.175332484077]

答案 1 :(得分:2)

你可以screenshot他们:

for a, b in zip([1,2,3], [4,5,6]):
  print a, b

将产生

1 4
2 5
3 6

答案 2 :(得分:2)

与普通的/ list comprehension / etc相比,numpy 矢量化方法将更多更快。特别是在大名单上:

import numpy as np

listA = np.array([51, 988, 1336, 2067, 1857, 3160])
listB = np.array([1, 2, 3, 4, 5, 6])
result = listA / np.pi * ((listB*0.1)+1)**2 - np.pi * (listB*0.1)**2

输出:

In [175]: result
Out[175]: array([   19.61148715,   452.74017757,   718.41005008,  1289.07255327,  1329.19288378,  2573.86868192])

两个1M列表的时间和比较:

In [183]: A = np.random.randint(1,100, 10**6)

In [184]: B = np.random.randint(1,100, 10**6)

In [185]: formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2

矢量化numpy方法:

In [186]: %timeit formula(A, B)
10 loops, best of 3: 65.4 ms per loop

列表理解:

In [191]: %timeit [ formula(a,b) for a,b in zip(A.tolist(),B.tolist()) ]
1 loop, best of 3: 3.6 s per loop

结论:矢量化方法快55倍

答案 3 :(得分:1)

第一个公式的代码:

from math import pi

def func(l1, l2):
    l = list()
    for x,n in zip(l1, l2):
        l.append(n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2)
    return l

listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
print  func(listA, listB)

输出:

[-69.86851405497168, -24325.709794885548, -38773.5481974975,   
 -79297.55058963387, -52859.75700368613, -121787.02310052476]