【问题标题】:Apply formula with two different lists应用具有两个不同列表的公式
【发布时间】:2016-05-28 10:53:57
【问题描述】:

我有两个这样的列表:

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

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

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

它会重复直到两个列表的末尾。

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

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

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

我已尝试以最好的方式解释自己,但如果您不理解我的问题,请随时提出任何问题。

提前致谢。

【问题讨论】:

    标签: python list python-2.7 math formula


    【解决方案1】:

    我假设两个列表一直都具有相同的大小,大多数 Python 方法是使用 lambda 和列表推导:

    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]
    

    【讨论】:

      【解决方案2】:

      你可以zip()他们:

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

      将产生

      1 4
      2 5
      3 6
      

      【讨论】:

        【解决方案3】:

        numpy vectorized 方法与常规 for/list comprehension/etc 相比将快得多。尤其是在大名单上:

        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 倍

        【讨论】:

          【解决方案4】:

          第一个公式的代码:

          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]
          

          【讨论】:

          • 它们必须在公式1之后计算,直到两个列表的末尾
          • 您需要打印结果还是存储?
          • 我需要返回它,因为这将发生在函数内部
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-06
          • 2021-02-09
          • 1970-01-01
          • 2018-03-18
          • 2023-04-03
          • 2012-01-09
          • 1970-01-01
          相关资源
          最近更新 更多