【问题标题】:How to convert listof list into single list without import如何在不导入的情况下将列表列表转换为单个列表
【发布时间】:2014-02-05 06:11:06
【问题描述】:

我的清单是:

a = [[1,2], [23,51,6], ["Hi", "hello"]]

我想要输出:

a = [ 1,2,23 51,6, "Hi", "hello"]

【问题讨论】:

    标签: python list python-2.7


    【解决方案1】:

    使用list comprehension

    >>> a = [[1,2], [23,51,6], ["Hi", "hello"]]
    >>> [x for xs in a for x in xs]
    [1, 2, 23, 51, 6, 'Hi', 'hello']
    

    【讨论】:

    • sum 有效,但它会导致不必要的 O(n^2) 性能。即使您希望输入较小的大小,它也几乎不应该用于此。
    • @user2357112,感谢您的评论。我删除了使用sum的解决方案。
    【解决方案2】:

    sum 与两个参数一起使用,列表列表和要添加到的空列表:

    >>> sum(a, [])
    [1, 2, 23, 51, 6, 'Hi', 'hello']
    

    这确实是reduce的特例:

    >>> reduce(list.__add__, a)
    [1, 2, 23, 51, 6, 'Hi', 'hello']
    

    事实上,我相信 Guido 从 Python 3 的内置函数中删除 reduce 的理由是大多数人只是使用它来添加事物列表(通常是数字)。一旦添加了sum 函数,reduce 就变得不那么重要了。 Python 3 需要导入才能使用 reduce

    如果您不关心导入模块,另一个选项是itertools.chain,它返回一个迭代器,该迭代器迭代其所有参数中的所有元素。您可以使用 list 构造函数将该迭代器转换为列表:

    >>> import itertools
    >>> list(itertools.chain(*a))
    [1, 2, 23, 51, 6, 'Hi', 'hello']
    

    【讨论】:

    • sum 有效,但当线性时间解决方案现成可用时,它会导致不必要的 O(n^2) 性能。
    【解决方案3】:

    你可以使用itertools.chain.from_iterable方法:

    >>> from itertools import chain
    >>> a = [[1,2], [23,51,6], ["Hi", "hello"]]
    >>> list(chain.from_iterable(a))
    [1, 2, 23, 51, 6, 'Hi', 'hello']
    

    请注意,这不适用于超过 2 层的嵌套。

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多