【问题标题】:Generate list with new items that contains more than one element生成包含多个元素的新项目列表
【发布时间】:2016-05-04 17:26:19
【问题描述】:

我有一个数组a。我想创建一个大小加倍的新数组,其中项目为 x*2 和 x*3。

例如:a = [1,10,100] 结果必须是b = [2,3,20,30,200,300]

我知道这种(丑陋且非常慢)方式:b = sum([[x*2,x*3] for x in a], [])

还有其他方式(我真的想要最短的方式:)?

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:

    这可以使用带有嵌套循环的列表推导来完成

    In [4]: [y for x in a for y in (x * 2, x * 3)]
    Out[4]: [2, 3, 20, 30, 200, 300]
    

    似乎优于所有答案,但在 a 很大时输给了 numpy 解决方案。

    【讨论】:

      【解决方案2】:

      您可以在列表推导中执行乘法运算,然后 zip 并展平结果列表。

      >>> a = [1,10,100]
      >>> b = [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
      >>> b
      [2, 3, 20, 30, 200, 300]
      

      【讨论】:

        【解决方案3】:

        您可以通过多种方式做到这一点。下面是其中之一,使用 numpy(第 4 行):

        In [1]: import numpy as np
        
        In [2]: a = [1, 10, 100]
        
        In [3]: %timeit sum([[x*2,x*3] for x in a], [])
        1000000 loops, best of 3: 632 ns per loop
        
        In [4]: %timeit x = np.array(a); np.array([x*2,x*3]).T.ravel()
        100000 loops, best of 3: 3.25 µs per loop
        

        你的方式更快!但这是因为a 很小。当它更大时,numpy 会变得更好。

        In [5]: a = range(1000)
        
        In [6]: %timeit sum([[x*2,x*3] for x in a], [])
        100 loops, best of 3: 2.37 ms per loop
        
        In [7]: %timeit x = np.array(a); np.array([x*2,x*3]).T.ravel()
        10000 loops, best of 3: 39.6 µs per loop
        

        包含上面@CoryKramer 答案的timeit 结果,这对于小型数组来说是最快的,但对于大型数组来说也输给了numpy:

        In [10]: a = [1, 10, 100]
        
        In [11]: %timeit [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
        1000000 loops, best of 3: 853 ns per loop
        
        In [12]: a = range(1000)
        
        In [13]: %timeit [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
        1000 loops, best of 3: 252 µs per loop
        

        【讨论】:

          【解决方案4】:

          一般使用元组比使用列表快:

          >>> timeit.timeit("sum([[x*2,x*3] for x in (1,10,100)], [])", number=10000)
          0.023060083389282227
          >>> timeit.timeit("sum(((x*2,x*3) for x in (1,10,100)), ())", number=10000)
          0.01667189598083496
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-08
            • 2021-07-19
            • 2017-05-03
            • 1970-01-01
            • 2020-06-18
            相关资源
            最近更新 更多