【问题标题】:Using zip function for combining long list of lists使用 zip 功能组合长列表
【发布时间】:2013-10-15 10:24:39
【问题描述】:

假设我有一个列表

mylist = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]

如果我想逐个元素添加,那么我可以使用如下逻辑:

[x+y for x,y in zip(mylist[0],mylist[1],mylist[2],mylist[3],mylist[4],mylist[6]]

它会给出列元素的总和。 但问题是,如果 mylist 恰好是 1000 个列表的列表并且我需要逐个元素地进行操作,那么在 zip 函数中编写 mylist 的每个索引有点尴尬和模糊。

我尝试将循环放入 zip 函数中,但它不起作用。那么有什么想法吗?

它应该像

zip(for k in mylist) # or something else

谢谢

【问题讨论】:

  • 在您的示例中,“zip”将为您提供 6-uples 的列表...
  • 您的示例有语法错误和逻辑错误,请尝试运行它。但我认为您正在寻找的是zip(*mylist)

标签: python list loops python-2.7 zip


【解决方案1】:

总结所有第一个元素,所有第二个元素等等:

In [2]: [sum(k) for k in zip(*mylist)]
Out[2]: [51, 57, 63]

请注意,输出中的每个数字都是len(mylist) 数字的总和:

In [3]: zip(*mylist)
Out[3]: [(1, 4, 7, 10, 13, 16), (2, 5, 8, 11, 14, 17), (3, 6, 9, 12, 15, 18)]

The * operator 解包 mylist,使其项目成为 zip 的单独参数。

【讨论】:

    【解决方案2】:

    另一种在这里看起来更明显的方法是使用内置 mapsum 旁边的 zip 在解压列表中

    >>> map(sum, zip(*mylist))
    [51, 57, 63]
    

    如果您是生成器的粉丝,以下内容可能会增加一些好处

    >>> from itertools import izip, imap
    >>> list(imap(sum, izip(*mylist)))
    [51, 57, 63]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多