如何将列表中的项连接(联接)为单个字符串

How to concatenate (join) items in a list to a single string

提问人:alvas 提问时间:9/17/2012 最后编辑:Karl Knechtelalvas 更新时间:11/7/2023 访问量:2115239

问:

如何将字符串列表连接成一个字符串?

例如,给定 ,我如何得到?['this', 'is', 'a', 'sentence']"this-is-a-sentence"


有关在单独的变量中处理几个字符串的信息,请参阅如何在 Python 中将一个字符串附加到另一个字符串?

对于相反的过程 - 从字符串创建列表 - 请参阅如何将字符串拆分为字符列表?或如何将字符串拆分为单词列表?视情况而定。

Python 字符串 列表 串联

评论


答:

1955赞 Burhan Khalid 9/17/2012 #1

使用 str.join

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

评论

21赞 Lawrence DeSouza 4/3/2014
不明白,左边的“-”应该是什么??
11赞 Burhan Khalid 4/6/2014
@LawrenceDeSouza 要联接的字符串;请参阅文档,或此答案,其中更详细地介绍了。
17赞 Wouter Thielen 8/23/2015
我有点期望也能工作,因为反向操作是.知道这是否会被添加到 Python 的列表方法中吗?sentence.join(" ")list.split(" ")
17赞 alexis 9/8/2015
@Wouter,它不会。一方面,只能连接字符串列表;因此,对于任意列表来说是不合适的。另一方面,参数可以是任何“可迭代”的字符串序列,而不仅仅是一个列表。唯一有意义的是内置函数;如果你真的想要的话,在(基本上已经过时的)模块中有一个。list.joinstr.joinjoin(list, sep)string
2赞 Burhan Khalid 12/15/2021
@Raghav您必须在对象上调用该方法,并将其转换为其字符串表示形式,str()''.join(map(str, [obj1,obj2,obj3]))
18赞 SilentVoid 11/2/2015 #2

从未来编辑:请不要使用下面的答案。此函数在 Python 3 中删除,Python 2 已失效。即使您仍在使用 Python 2,您也应该编写 Python 3 就绪代码,以使不可避免的升级更容易。


虽然@Burhan哈立德的回答很好,但我认为这样更容易理解:

from str import join

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

join(sentence, "-") 

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

评论

23赞 Matthew Green 11/20/2015
此函数在 2.x 中已弃用,并将在 3.x 中删除。既然如此,我不建议使用它而不是提供的其他答案。
0赞 SilentVoid 11/21/2015
@Mathew格林,这个答案和布尔汉·哈立德的答案以不同的方式使用相同的函数,所以他的答案也被弃用了。但感谢您指出这一点,必须弄清楚如何加入 3.x。但是,如果您使用的是 2.x,它不会消失。
3赞 Matthew Green 11/21/2015
不过,他并没有被弃用。您的建议使用 Lib/string 中的函数.py该函数完全不同已弃用,而@BurhanKhalid答案使用未弃用的内置字符串方法。他的答案是现在和未来最正确的答案,而这目前只适用于 2.x。
0赞 Matthew Green 11/21/2015
综上所述,如果您想推广此替代方案,您还应该包括一个警告,即由于我之前的评论中概述的原因,不建议这样做。
2赞 SilentVoid 11/23/2022
可怕的是,我仍然在这个问题上获得赞成票。说真的,使用 python 3。
255赞 Aaron S 12/1/2015 #3

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

>>> 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赞 alvas 12/1/2015
当输入是字符串时,为什么需要列表推导?无需枚举列表也就足够了 =)map(str, my_lst)
22赞 Aaron S 12/2/2015
这个问题的大多数答案都是在考虑列表中有字符串的情况。我的是将列表转换为字符串的通用方法。在我的示例中,列表是类型,但它可以是可以表示为字符串的任何类型。int
5赞 ScottMcC 6/22/2017
除此之外,map 在与 lambda 函数一起使用时也很有用。例如,会返回' '.join(map(lambda x: ' $'+ str(x), my_lst))'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10'
4赞 appleboy 2/28/2019
添加映射实际上有助于处理除字符串之外的数据类型。伟大!
1赞 pabouk - Ukraine stay strong 7/15/2023
在 Python 中,最好使用生成器表达式而不是 和 。按 @ScottMcC 更新了示例: 计算结果为: --- 注意:原始示例在map()lambda' '.join(f'${x}' for x in my_lst)'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10'' $'
64赞 Wallebot 5/14/2016 #4

对于初学者来说,了解为什么 join 是一个字符串方法非常有用。

一开始很奇怪,但之后非常有用。

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

.join速度更快,因为它只分配一次内存。比经典串联更好(参见,扩展解释)。

一旦你学会了它,它就很舒服了,你可以做这样的技巧来添加括号。

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

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

评论

3赞 cryanbhu 11/12/2020
有人可以解释一下第二个是什么,即 做吗?它就像魔术一样join()join(("(",")"))
5赞 zepman 2/19/2021
("(",")")是两个字符串的元组 - 左括号和右括号。因此,第二个字符串使用第一个字符串的输出作为分隔符(即 )。"("")"join()join()'1,2,3,4,5'
0赞 O'Rooney 3/29/2022
这是正确的吗?“联接的结果始终是一个字符串,但要联接的对象可以有多种类型(生成器、列表、元组等)。”Aaron S 的回答表明这不是真的,如果列表中有其他类型,则必须使用 map(str, )。
1赞 8/17/2022
@O鲁尼的答案是说你可以列表、元组或生成器,它们是不同类型的集合,但它们应该只包含字符串。.join
0赞 Bob Stein 6/30/2023
好吧,投票支持它,因为它很可爱,但说真的,不要为你想让人类理解的代码这样做。我承认它可能对代码高尔夫或邪恶有用。
10赞 Nishkarsh Dixit 11/29/2018 #5

我们也可以使用 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赞 Sebastián Palma 12/2/2019
太多不必要的复杂性,为什么不直接使用?join
0赞 user453575457 11/29/2023
在我的 cace join 中并不能完成所有工作,我需要添加更多符号,所以减少效果更好
9赞 Abhishek V 10/18/2019 #6

我们可以指定如何连接字符串。代替 ,我们可以使用:'-'' '

sentence = ['this','is','a','sentence']
s=(" ".join(sentence))
print(s)
0赞 Pyte 5/8/2020 #7
def eggs(someParameter):
    del spam[3]
    someParameter.insert(3, ' and cats.')


spam = ['apples', 'bananas', 'tofu', 'cats']
eggs(spam)
spam =(','.join(spam))
print(spam)

评论

4赞 alan.elkin 5/8/2020
虽然此代码片段可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您将来正在为读者回答问题,而这些人可能不知道您提出代码建议的原因。
1赞 Carmoreno 6/30/2020 #8

如果要在最终结果中生成用逗号分隔的字符串字符串,可以使用如下所示:

sentence = ['this','is','a','sentence']
sentences_strings = "'" + "','".join(sentence) + "'"
print (sentences_strings) # you will get "'this','is','a','sentence'"

评论

0赞 pabouk - Ukraine stay strong 7/15/2023
它有效,但这段代码更好地遵循了事物的逻辑:作为一个重要的奖励,你有字符将字符串括在一个地方,而不是分散在整个表达式中。sentences_strings = ','.join(f"'{word}'" for word in sentence)'
-1赞 Abdulmecid Pamuk 7/7/2020 #9

如果没有 .join() 方法,您可以使用此方法:

my_list=["this","is","a","sentence"]

concenated_string=""
for string in range(len(my_list)):
    if string == len(my_list)-1:
        concenated_string+=my_list[string]
    else:
        concenated_string+=f'{my_list[string]}-'
print([concenated_string])
    >>> ['this-is-a-sentence']

因此,在这个例子中,基于范围的 for 循环,当 python 到达列表的最后一个单词时,它不应该在你的concenated_string中添加“-”。如果它不是字符串的最后一个单词,请始终将“-”字符串附加到concenated_string变量中。

18赞 mounirboulwafa 9/3/2020 #10
>>> 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

评论

0赞 pabouk - Ukraine stay strong 7/15/2023
在输出上反向使用提示序列而不是命令非常令人困惑。>>>
2赞 wiredcontrol 1/27/2021 #11

如果您有一个混合内容列表并想要将其字符串化,则有一种方法:

请考虑以下列表:

>>> 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赞 Tomerikoo 1/19/2022
为什么会如此复杂? 也给了......str(aa)"[None, 10, 'hello']"
0赞 cottontail 9/20/2023 #12

也可以通过解压缩列表来联接列表中的值,该列表将值按顺序插入占位符中。它也可以处理非字符串。str.format()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'
-1赞 Chirag 11/7/2023 #13

a=['这个', '是', '一个', '句子'] 打印('-'.join(a))

评论

0赞 Chris 11/7/2023
这只是复制十多年前接受的部分答案,删除格式,并更改变量名称以使其不那么清晰。请不要重复答案。