【问题标题】:Python: Produce list which is a sum of two lists, item-wise [duplicate]Python:产生列表,它是两个列表的总和,逐项[重复]
【发布时间】:2012-07-09 20:53:52
【问题描述】:

假设我有两个列表:

a=[1,2,3,4,5]
b=[5,4,3,2,1]

我想创建第三个,它将是两个给定的线性和:

c[i]==a[i]+b[i]
c==[6,6,6,6,6]

是否可以使用“for”构造函数?喜欢:

c = [aa+bb for aa in a for bb in b]

(显然返回的不是我想要的)

【问题讨论】:

  • 我不清楚分配给c 的结果是什么,所以我在IDLE 中尝试了它并粘贴了c 的值以进行说明。

标签: python list list-comprehension


【解决方案1】:

使用zip():

>>> a = [1,2,3,4,5]
>>> b = [5,4,3,2,1]
>>> c = [x+y for x,y in zip(a, b)]
>>> c
[6, 6, 6, 6, 6]

或:

>>> c = [a[i] + b[i] for i in range(len(a))]
>>> c
[6, 6, 6, 6, 6]

c = [aa+bb for aa in a for bb in b] 类似于:

 for aa in a:
     for bb in b:
           aa+bb

这意味着,从a 中选择1,然后循环遍历b 的所有元素,同时将它们添加到1,然后从a 中选择2,然后再次循环遍历所有值b 将它们添加到 2 时,这就是您没有得到预期输出的原因。

【讨论】:

  • 领先我 15 秒。 +1,我会删除我的。
  • 不应该使用for i in range(len(a)),使用迭代器是更好的做法。
  • 做了一些timeit,在测试了本站所有的解决方案后,最快的是starmap(add, zip(a, b)),打卡时间为0.65s。以上解法分别为1.18s和0.94s。
【解决方案2】:
a=[1,2,3,4,5]
b=[5,4,3,2,1]

[x+y for x,y in zip(a,b)]
[6, 6, 6, 6, 6]

OR

map(lambda x,y:x+y, a, b)
[6, 6, 6, 6, 6]

【讨论】:

  • +1 for map() 具有多个序列,隐式执行 izip_longest
【解决方案3】:
[ay + be for ay, be in zip(a, b)]

【讨论】:

    【解决方案4】:
     sums =   [a[i]+b[i] for i in range(len(a))]
    

    【讨论】:

    • 感谢您的点...不知道为什么这正是他所要求的...
    • 不正确。 range() 接受一个整数,而不是一个列表:ideone.com/bnDMC。您应该改用 len(a)。
    • 哦,是的,你的权利……打字太快了……已修复……(但它也包含在 Ashwini Chaudhary 的帖子中)
    • 删除了反对票以进行快速修复。
    • 是的,我现在对我的负面愤怒感到有点不好意思......因为我在这种情况下实际上是错的
    【解决方案5】:

    我不知道您要做什么,但是您可以使用 numpy.我只是不确定您是否真的想在代码中添加额外的依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多