我有一个字符串列表,如下所示
lst = [['a','b','c'],['@','$','#'],['1','2','3']]
我想明智地将list元素内的每个字符串连接起来,预期输出如下:
['a@1','b$2','c#3']
lst
的大小可以变化。有什么方法可以完成此任务而无需进行for循环。
我尝试使用地图,但无法正常工作。
map(str.__add__,(x for x in list))
请帮助。
答案 0 :(得分:11)
这是压缩子列表并使用''.join
映射生成的元组的一种方法:
list(map(''.join, zip(*lst)))
# ['a@1', 'b$2', 'c#3']
此处zip
如文档所示,聚集了多个可迭代元素。通过添加*
,我们将解压缩列表,这意味着该函数将改为接收zip(['a','b','c'],['@','$','#'],['1','2','3'])
。
现在,在每次迭代中,map
将''.join
应用于每个聚合的可迭代对象,即,应用于每个子列表中的第一个元素,然后应用于第二个,依此类推。
答案 1 :(得分:2)
不如yatu's answer优雅,但是如果您使用的是熊猫:
import pandas as pd
pd.DataFrame(lst).sum(axis=0)
# 0 a@1
# 1 b$2
# 2 c#3
# dtype: object
熊猫系列有一种.tolist()
方法来获得预期的输出:
series = pd.DataFrame(lst).sum(axis=0)
series.tolist()
# ['a@1', 'b$2', 'c#3']
答案 2 :(得分:1)
列表中的字符串也有以下问题,
1) 多余的空格 ,包括开头和结尾,
2)还必须 将字符串连接起来,并在其之间插入空格 。
3)列表内的列表长度总是不相同,以下示例中的长度list[0]
,list[1]
和{{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_longest
完成不同长度的连接元素,如下所示:
fillvalue=''
输出如下:
from itertools import zip_longest
[' '.join(x.split()) for x in map(' '.join, zip_longest(*lst,fillvalue=''))]