【问题标题】:Quicker way to join multiple lists passed as args to a Python function?将多个列表作为参数传递给 Python 函数的更快方法?
【发布时间】:2021-02-16 13:49:27
【问题描述】:

所以我有一个函数,它将可变数量的列表作为参数,然后将这些列表组合成一个列表:

def comb_lists(*lists):
    sublist = []
    for l in lists:
        sublist.extend(l)
    print(sublist)
    
>>> comb_lists([1, 2], [3, 4], [5, 6])
[1, 2, 3, 4, 5, 6]

而且它有效。但我只是想知道是否有更简单的解决方案?我尝试了使用列表解包的列表推导,但返回了 SyntaxError:

def comb_lists(*lists):
    sublist = [*l for l in lists]
    
>>> comb_lists([1, 2], [3, 4], [5, 6])
SyntaxError: iterable unpacking cannot be used in comprehension

有没有更简洁或更快的方法来做到这一点?

编辑: itertools 看起来对这类事情非常有用。我很想知道是否有任何不依赖进口的方法。

【问题讨论】:

  • 试试list(itertools.chain(*lists))?

标签: python python-3.x list concatenation


【解决方案1】:

这是最简单的解决方案

result = sum(lists, [])

【讨论】:

  • 这非常优雅并且完美运行!但是,为什么它会起作用?为什么 sum 函数不只是将列表的内容相加?
  • @Lou 如果给定第二个参数,则 sum 函数将 iterable 的值与第二个参数一一相加。 “列表”实际上是列表列表,这就是它没有添加内容的原因。参考:programiz.com/python-programming/methods/built-in/sum
【解决方案2】:

itertools 模块中有内置函数chain.form_iterable() 可以做到这一点:

>>> from itertools import chain
>>> my_list = [[1, 2], [3, 4], [5, 6]]

>>> list(chain.from_iterable(my_list))
[1, 2, 3, 4, 5, 6]

如果你不想导入任何模块,你可以编写嵌套列表理解来实现:

>>> my_list = [[1, 2], [3, 4], [5, 6]]

>>> [e for l in my_list for e in l]
[1, 2, 3, 4, 5, 6]

【讨论】:

  • 谢谢!我很想知道是否还有其他不使用导入的解决方案,但这是一个有用的答案
  • @Lou 更新为基于 list comprehension 的解决方案
猜你喜欢
  • 2011-08-18
  • 2012-11-13
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多