【问题标题】:How do I add a number to a list of lists?如何将数字添加到列表列表中?
【发布时间】:2014-05-07 18:49:19
【问题描述】:

假设我有清单

[[1,2,3], [4,5,6]]

我想给每个元素加 5。

那么新的列表将是 [[6, 7, 8], [9, 10, 11]] 作为答案。

def add(num, list):

【问题讨论】:

标签: python list sum element add


【解决方案1】:

只需做一个嵌套列表理解(不要使用list 作为名称,它会覆盖内置):

def add(num, lst):
    return [[item+num for item in sub] for sub in lst]

演示:

>>> test = [[1, 2, 3], [4, 5, 6]]
>>> add(5, test)
[[6, 7, 8], [9, 10, 11]]

【讨论】:

  • @AlexThomton 您的解决方案看起来很简单,与我使用部分的“太聪明”的解决方案相比,您的解决方案也快了两倍以上。
  • @user2581724 如果这解决了你的问题,请考虑接受这个答案,这是说“谢谢”的标准方式
【解决方案2】:

部分和运算符添加的小练习

operator 模块中有add 运算符

>>> from operator import add
>>> add(7, 5)
12

functool 允许 partial 构建新功能

>>> from functools import partial
>>> add5 = partial(add, 5)
>>> add5(7)
12

使用mapadd5 应用于简单的sublst

>>> sublst = [1,2,3]
>>> map(add5, sublst)
[6, 7, 8]

按要求使用嵌套列表

>>> lst = [[1,2,3], [4,5,6]]
>>> [map(add5, sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]

测量执行时间

使用已经准备好的函数add5

>>> %timeit [map(add5, sublst) for sublst in lst]
1000000 loops, best of 3: 1.23 µs per loop

使用建议的答案之一:

>>> [[item+5 for item in sub] for sub in lst]
[[6, 7, 8], [9, 10, 11]]

>>> %timeit [[item+5 for item in sub] for sub in lst]
1000000 loops, best of 3: 658 ns per loop

add5 在我们需要的时候创建:

>>> [map(partial(add, 5), sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]
>>> %timeit [map(partial(add, 5), sublst) for sublst in lst]
1000000 loops, best of 3: 1.5 µs per loop

使num成为变量:

>>> num = 5
>>> [map(partial(add, num), sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]

构建问题所需的功能

>>> def add2lst(num, lst):
...     return [map(partial(add, num), sublst) for sublst in lst]
...

经过测试,它可以工作

>>> add2lst(5, lst)
[[6, 7, 8], [9, 10, 11]]

结论 - 太聪明可能会减慢速度

>>> timeit.timeit("[[item+5 for item in sub] for sub in lst]", setup="from functools import partial;from operator import add;lst=[[1,2,3],[4,5,6]]", number=rep)
6.1195290088653564
>>> timeit.timeit("[map(partial(add, 5), sublst) for sublst in lst]", setup="from functools import partial;from operator import add;lst=[[1,2,3],[4,5,6]]", number=rep)
14.058987140655518

使用运算符的智能概念和部分增加的执行复杂性,导致此解决方案比简单解决方案慢两倍以上。

所以:“保持简单”

【讨论】:

  • +1 一系列记录良好的实验,我同意这个结论(除非迫切需要速度, 的忠实拥护者,否则我会选择任何一种方式,“简单优于复杂。” - Python 之禅)
【解决方案3】:

如果你愿意使用Numpy

import numpy as np

np.array([[1,2,3], [4,5,6]]) + 5

将添加5元素返回:

array([[ 6,  7,  8],
       [ 9, 10, 11]])

【讨论】:

    【解决方案4】:

    map() 和一个列表理解就可以了:

    def add(num, lst):
        return [map(lambda x: x + num, l) for l in lst]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2017-02-20
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多