【问题标题】:Element wise concatenate multiple lists (list of list of strings)元素明智地连接多个列表(字符串列表列表)
【发布时间】:2019-10-22 02:37:27
【问题描述】:

我有一个如下的字符串列表

lst = [['a','b','c'],['@','$','#'],['1','2','3']]

我想明智地连接列表元素中的每个字符串,预期输出如下:

['a@1','b$2','c#3']

lst 的大小可以变化。有什么方法可以在不通过 for 循环的情况下完成此操作。
我尝试使用地图,但它不起作用。

map(str.__add__,(x for x in list))

请帮忙。

【问题讨论】:

  • 不是您问题的答案,但列表理解通常是一种可读的替代方案:[f'{i}{j}{k}' for i, j, k in zip(*lst)]
  • [''.join(x) for x in zip(*lst)]

标签: python python-3.x list concatenation


【解决方案1】:

这是压缩子列表并使用''.join 映射生成的元组的一种方法:

list(map(''.join, zip(*lst)))
# ['a@1', 'b$2', 'c#3']

这里zip 如文档中所示聚合来自多个可迭代对象的元素。使用*,我们将列表解压缩为单独的可迭代对象,这意味着该函数将接收zip(['a','b','c'],['@','$','#'],['1','2','3'])

现在在每次迭代中,map 将把 ''.join 应用到每个聚合的迭代器上,即应用到每个子列表中的第一个元素,然后是第二个元素,依此类推。

【讨论】:

    【解决方案2】:

    不像yatu's answer那么优雅,但如果你使用的是pandas:

    import pandas as pd
    pd.DataFrame(lst).sum(axis=0)
    
    # 0    a@1
    # 1    b$2
    # 2    c#3
    # dtype: object
    

    Pandas 系列有一个.tolist() 方法来获得预期的输出:

    series = pd.DataFrame(lst).sum(axis=0)
    series.tolist()
    
    # ['a@1', 'b$2', 'c#3']
    

    【讨论】:

      【解决方案3】:

      列表中的字符串也存在以下问题,
      1) 额外的空格,包括前导和尾随,
      2) 还必须用空格连接字符串
      3) 列表中的列表长度总是不相同,对于以下示例,list[0]list[1]list[2] 的长度为4,4 and 3

      示例列表如下:

      lst= [['  It is    raining  ','  Hello Mr.   x','  Life   is what   happens','This'],
            ['cats   and   dogs','how are you','when you are busy','ends here'],
            ['here now    ','doing today?    ','making   other   plans  ']]
      

      第一种和第二种情况可以通过拆分列表中的每个元素来解决(默认使用空格拆分,这将删除所有空格),然后将它们连接在一起,中间有一个空格。
      可以使用 itertools.zip_longestfillvalue='' 连接不同长度的元素,如下所示:

      from itertools import zip_longest
      [' '.join(x.split()) for x in map(' '.join, zip_longest(*lst,fillvalue=''))]
      

      输出如下:

      ['It is raining cats and dogs here now',
       'Hello Mr. x how are you doing today?',
       'Life is what happens when you are busy making other plans',
       'This ends here']
      

      【讨论】:

        猜你喜欢
        • 2017-04-16
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多