【问题标题】:How can I apply a function to each element of a nested list? [duplicate]如何将函数应用于嵌套列表的每个元素? [复制]
【发布时间】:2016-08-22 12:05:19
【问题描述】:

从列表中,M:

M = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

我想创建一个新列表 L,所有项目都加倍。

到目前为止,我尝试了迭代、推导和 lambda 表达式的各种组合,但都无济于事。

什么是最简单/最快的方法?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

嵌套列表推导式可以:

double_M = [[2 * x for x in inner] for inner in M ]
>> [[2, 4, 6], [8, 10, 12], [14, 16, 18]]

【讨论】:

  • 你有一个杂散的括号。
  • @StevenRumbalski 谢谢,解决了。
【解决方案2】:

如果您使用numpy,您可以将整个矩阵加倍:

In [1]: import numpy as np

In [2]: M = [[1, 2, 3],
   ...:      [4, 5, 6],
   ...:      [7, 8, 9]]

In [3]: np.array(M) * 2
Out[3]: 
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])

【讨论】:

    【解决方案3】:

    以下是固定 3x3 矩阵的小基准:

    import numpy as np
    import timeit
    
    M = [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]]
    
    
    def f1(M):
        return [[x * 2 for x in r] for r in M]
    
    
    def f2(M):
        return np.array(M) * 2
    
    K=1000000
    print(timeit.timeit('f1(M)', setup='from __main__ import f1, M', number=K))
    print(timeit.timeit('f2(M)', setup='from __main__ import f2, M', number=K))
    
    # 1.886869086403203
    # 3.470187123186767
    # [Finished in 5.6s]
    

    我会说 f1 在速度方面是一个不错的选择

    【讨论】:

    • 可能的原因是在 f2 中转换为 np.array 而 f1 返回默认的 python 列表。如果在 f1 中添加转换 (np.array(***)),结果会比在 f2 中更慢
    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2011-08-07
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多