【问题标题】:Merging a list of lists合并列表列表
【发布时间】:2011-12-15 06:39:58
【问题描述】:

如何合并列表列表?

[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]

进入

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

如果我可以在合并列表之前在每个项目的开头和结尾添加一个值,那就更好了,比如 html 标记。

即,最终结果将是:

['<tr>A</tr>', '<tr>B</tr>', '<tr>C</tr>', '<tr>D</tr>', '<tr>E</tr>', '<tr>F</tr>', '<tr>G</tr>', '<tr>H</tr>', '<tr>I</tr>']

【问题讨论】:

  • 在合并列表之前是否要添加标签?我有点简化了我的问题。
  • 简化您的问题。我不明白我们如何在不知道哪些限制阻止您使用明显的解决方案的情况下说如何添加标签

标签: python list merge list-comprehension itertools


【解决方案1】:

使用itertools.chain:

>>> import itertools
>>> list(itertools.chain(*mylist))
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

之后可以在 HTML 中包装元素。

>>> ['<tr>' + x + '</tr>' for x in itertools.chain(*mylist)]
['<tr>A</tr>', '<tr>B</tr>', '<tr>C</tr>', '<tr>D</tr>', '<tr>E</tr>', '<tr>F</tr>',
'<tr>G</tr>', '<tr>H</tr>', '<tr>I</tr>']

请注意,如果您尝试生成有效的 HTML,您可能还需要 HTML escape 字符串中的某些内容。

【讨论】:

    【解决方案2】:

    要连接列表,您可以使用sum

    values = sum([['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']], [])
    

    要添加 HTML 标签,您可以使用列表推导。

    html_values = ['<tr>' + i + '</tr>' for i in values]
    

    【讨论】:

      【解决方案3】:
      import itertools
      
      print [('<tr>%s</tr>' % x) for x in itertools.chain.from_iterable(l)]
      

      您可以使用 sum,但我认为这有点难看,因为您必须传递 [] 参数。正如雷蒙德指出的那样,它也会很昂贵。所以不要使用 sum。

      【讨论】:

      • itertools 建议很好,但 sum() 建议不是。后者是一个 O(n*n) 操作 :-(
      • @Raymond:如果左操作数的引用计数为 1,是否可以修改 + 运算符以使列表正常工作?这会将sum() 版本的复杂度降低到 O(n) 吗?
      • Sven,虽然我认为 Guido 不会有兴趣支持它,但它可能会起作用——他已经拒绝使用 sum() 对字符串求和的 ''.join() 样式逻辑。
      • @SvenMarnach,实际上 sum 实现中的 cmets 提到了精确地进行就地加法以消除这里的二次行为的可能性。它指出优化实际上并未完成,因为它最终会将第二个参数修改为 sum。
      • @Winston:我不会在sum() 中执行此操作,我会在列表的+ 运算符中执行此操作,并且仅当列表的引用计数为1 时。这将表示sum(list_of_lists, [])已经优化——这里允许修改sum()的第二个参数——而a = []; sum(list_of_lists, a)没有优化——不允许修改a
      【解决方案4】:

      不要使用 sum(),加入列表很慢。

      nested list comprehension 将起作用:

      >>> x = [['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
      >>> [elem for sublist in x for elem in sublist]
      ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
      >>> ['<tr>' + elem + '</tr>' for elem in _]
      

      使用itertools.chain 的建议也很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 2012-09-06
        相关资源
        最近更新 更多