如何将列表中的项目连接成一个字符串

1139
13个回答

1955

使用str.join函数:

>>> words = ['this', 'is', 'a', 'sentence']
>>> '-'.join(words)
'this-is-a-sentence'
>>> ' '.join(words)
'this is a sentence'

21
不明白,左边的“-”代表什么意思? - Lawrence DeSouza
11
@LawrenceDeSouza 您想要连接的字符串;请参阅文档或者这个答案,后者更加详细。 - Burhan Khalid
17
我本以为 sentence.join(" ") 也能起作用,因为它的反向操作是 list.split(" ")。你知道这个功能是否会被添加到Python列表方法中吗? - Wouter Thielen
17
@Wouter,不会。一方面,只有字符串列表可以加入;因此,list.join对于任意列表来说都不合适。另一方面,str.join的参数可以是任何“可迭代”的字符串序列,而不仅仅是一个列表。唯一有意义的是内置函数join(list,sep);如果你真的需要它,在(基本上已过时的)string模块中有一个。 - alexis
2
@Raghav,你需要在对象上调用str()方法,这将把它转换为字符串表示形式,''.join(map(str, [obj1,obj2,obj3])) - Burhan Khalid
显示剩余6条评论

255

将列表转换为字符串的更通用方法(也适用于数字列表)是:

>>> my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> my_lst_str = ''.join(map(str, my_lst))
>>> print(my_lst_str)
12345678910

3
为什么在输入为字符串时需要使用列表推导式?同时 map(str, my_lst) 就足够了,不需要枚举列表 =) - alvas
22
大多数对这个问题的回答都考虑了列表中包含字符串的情况。我的方法是将列表通用地转换为字符串。在我的示例中,列表的类型为 int,但它可以是任何可以表示为字符串的类型。 - Aaron S
5
此外,当与lambda函数一起使用时,map也会非常有用。例如,' '.join(map(lambda x: ' $'+ str(x), my_lst))将返回'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10' - ScottMcC
4
添加地图实际上有助于除字符串以外的数据类型。太好了! - appleboy
1
在Python中,更倾向于使用生成器表达式而不是map()lambda。@ScottMcC更新的示例:' '.join(f'${x}' for x in my_lst)的计算结果为:'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10' --- 注意:原始示例中的' $'有不需要的空格。 - pabouk - Ukraine stay strong

64

初学者了解为什么join是字符串方法非常有用。

一开始可能很奇怪,但之后会变得非常有用。

join的结果始终是一个字符串,但要连接的对象可以是许多类型(生成器、列表、元组等)。

.join更快,因为它仅分配一次内存。优于经典串联(详见详细解释)。

一旦你学会了它,就会非常方便,你可以使用类似这样的技巧添加括号。

>>> ",".join("12345").join(("(",")"))
Out:
'(1,2,3,4,5)'

>>> list = ["(",")"]
>>> ",".join("12345").join(list)
Out:
'(1,2,3,4,5)'

3
有人能解释一下第二个 join(),也就是 join(("(",")")) 是干什么的吗?就像魔法一样。 - cryanbhu
5
("(",")")是由两个字符串组成的元组 - 开括号"("和闭括号 ")"。因此,第二个join()方法使用第一个join()方法的输出作为分隔符将这两个字符串连接起来(即'1,2,3,4,5')。 - zepman
这句话正确吗?“连接的结果总是一个字符串,但要连接的对象可以是许多类型(生成器、列表、元组等)。” Aaron S的答案表明这不是真的,如果列表中有其他类型,则必须使用map(str,)。 - O'Rooney
1
@O'Rooney,这个答案的意思是你可以使用.join方法连接列表、元组或生成器,它们是不同类型的集合,但它们应该只包含字符串。 - user3064538
好的,我给这个点赞是因为它太可爱了,但是说真的,如果你想让人类能够理解你的代码,请不要这样做。我承认这可能对于代码竞赛或者恶作剧有用。 - Bob Stein

18

来自未来的编辑:请不要使用下面的答案。此功能已在Python 3中删除,并且Python 2已经过时。即使您仍在使用Python 2,也应编写适用于Python 3的代码,以便更轻松地进行必要的升级。


尽管@Burhan Khalid的答案很好,但我认为这样更容易理解:

from str import join

sentence = ['this','is','a','sentence']

join(sentence, "-") 

join()的第二个参数是可选的,默认为“ ”。


23
这个函数在2.x版本已经被弃用,并且将在3.x版本中被移除。因此,我不建议使用它而不是提供的其他答案。 - Matthew Green
@Mathew Green,这个回答和Burhan Khalid的回答使用了相同的函数,只是用法不同,所以他的回答也已经过时了。但是谢谢你指出来,我得弄清楚如何在3.x版本中加入。但是如果你在使用2.x版本,它不会消失。 - SilentVoid
3
他的方法并没有被弃用。你的建议使用了Lib/string.py中一个完全不同且已经被弃用的函数,而@BurhanKhalid的答案使用了内置的字符串方法,这个方法并没有被弃用。他的答案现在和将来都是最正确的,而这个建议只适用于2.x版本。 - Matthew Green
那么说,如果你想推广这个替代方案,你应该包含一个警告,说明出于我之前评论中列举的原因,这并不被推荐。 - Matthew Green
2
很可怕,我仍然在这上面得到了赞。认真点,使用Python 3。 - SilentVoid

18
>>> list_abc = ['aaa', 'bbb', 'ccc']

>>> string = ''.join(list_abc)
>>> print(string)
aaabbbccc

>>> string = ','.join(list_abc)
>>> print(string)
aaa,bbb,ccc

>>> string = '-'.join(list_abc)
>>> print(string)
aaa-bbb-ccc

>>> string = '\n'.join(list_abc)
>>> print(string)
aaa
bbb
ccc

反向使用提示序列>>> 作为输出而不是命令非常令人困惑。 - pabouk - Ukraine stay strong

10
我们也可以使用Python的reduce函数:
from functools import reduce

sentence = ['this','is','a','sentence']
out_str = str(reduce(lambda x,y: x+"-"+y, sentence))
print(out_str)

11
为什么要这么复杂呢?直接使用 join 不就好了吗? - Sebastián Palma
在我的情况下,仅仅加入并不能完成所有的工作,我需要添加更多的符号,这样减少才更有效。 - undefined

9
我们可以指定如何连接字符串。我们可以使用空格' '而不是'-'
sentence = ['this','is','a','sentence']
s=(" ".join(sentence))
print(s)

2
如果您有一个混合内容列表并想将其转换为字符串,下面是一种方法: 考虑以下列表:
>>> aa
[None, 10, 'hello']

将其转换为字符串:

>>> st = ', '.join(map(str, map(lambda x: f'"{x}"' if isinstance(x, str) else x, aa)))
>>> st = '[' + st + ']'
>>> st
'[None, 10, "hello"]'
如果需要,转换回列表:
>>> ast.literal_eval(st)
[None, 10, 'hello']

2
为什么要这么复杂?str(aa)也会返回"[None, 10, 'hello']"... - Tomerikoo

1
如果您想生成由逗号分隔的字符串串联成的最终结果,您可以使用类似以下的代码:
sentence = ['this','is','a','sentence']
sentences_strings = "'" + "','".join(sentence) + "'"
print (sentences_strings) # you will get "'this','is','a','sentence'"

这段代码虽然能运行,但是下面这段代码更符合逻辑:sentences_strings = ','.join(f"'{word}'" for word in sentence) 作为一个重要的额外好处,你可以在一个地方将字符串 ' 包围起来,而不是散布在整个表达式中。 - pabouk - Ukraine stay strong

0
也可以使用str.format()来通过解包列表内的值将列表中的值按顺序插入占位符中,从而将列表中的值连接起来。它还可以处理非字符串类型的值。
lst1 = ['this', 'is', 'a', 'sentence']
lst2 = ['numbers', 1, 2, 3]
'{}-{}-{}-{}'.format(*lst1)       # 'this-is-a-sentence'
'{} {}, {} and {}'.format(*lst2)  # 'numbers 1, 2 and 3'
对于一个大列表,我们可以使用列表的长度来初始化相应数量的占位符。有两种方法可以实现这一点:
  • ', '.join(['{}']*len(lst)).format(*lst)
    
  • ('{}, '*len(lst)).rstrip(', ').format(*lst)
    
一个工作示例:
lst = [1.2345, 3.4567, 4.567, 5.6789, 7.8]
', '.join(['{}']*len(lst)).format(*lst)      # '1.2345, 3.4567, 4.567, 5.6789, 7.8'
('{}, '*len(lst)).format(*lst).rstrip(', ')

# with a float format specification
', '.join(['{:.2f}']*len(lst)).format(*lst)  # '1.23, 3.46, 4.57, 5.68, 7.80'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,