Pythonic列表转字符串方法

3

我想知道将列表转换为字符串的最“Pythonic”方法。

例如:

string_list = ['h', 'e', 'l', 'l', 'o']
# to the string
string = 'hello'

我一直在使用''.join(string_list)方法,但感觉这种做法过于繁琐,不够简洁明了。
是否有更好的方法呢?或者说我是不是把问题想复杂了?

4
信不信由你,这确实是可读性较高的写法,但也有些Python的特殊用法。 - jamylak
4
''.join(list) 是一种非常具有Python风格的方式,您是在寻求更高效的方法吗? - Inbar Rose
1
另外,不要把你的列表命名为“list”,这会掩盖内置函数。 - jamylak
是的,这不是效率问题,只是我觉得很丑陋。但如果这是通常的方式! - Fergus Barker
@InbarRose 这是最有效的方式。 - jamylak
3个回答

5

不,这是使用Python的方式。

也许你认为应该这样写:string_list.join('')。你并不孤单。

最重要的优点可能是,这使得.join()可以与任何可迭代对象一起使用。

如果反过来,每个集合都需要自己实现一个join()方法。如果你要创建自己的集合,你会添加一个.join()方法吗?可能不会。

它作为str类的一个方法的事实意味着它将始终有效。没有什么惊喜。在此处阅读 Python和最小惊讶原则了解join()和其他由Flask作者Armin Ronacher提出的问题。

对于在上述文章开头找到的len()函数/运算符,可以提出类似的论点。


1
离题评论警告。从(优秀的)链接文章中:“装饰器有点痛苦,因为@foo和@foo()之间存在差异。如果它们以前一种方式声明,那么前者就意味着后者,我们现在都会更加快乐。每次我想要向以前没有参数的装饰器引入参数时,都让我想用棍子打自己和装饰器PEP的作者。”哈哈。确实! - Ghopper21

4

使用''.join(string_list)。请注意,list是一个内置类型的名称,因此不应将其用作变量名。由于Python字符串是不可变的,因此您需要构造一个新字符串。在Python中,''.join(s)是规范且高效的方法。


2
@InbarRose + 方法会创建 n 个临时副本。而 str.join 方法会在单次预处理中保留所需的空间。因此,.join 方法将在非平凡情况下优于简单的 + 运算符,特别是在有许多字符串需要连接的情况下。 - Preet Kukreti
2
.join() 字符串方法实际上是 Python 中组装多部分字符串最有效的方法。字符串相加很慢,因为它会创建许多字符串:首先它创建 s[0]+'',然后将 s[1] 添加到该结果字符串中以创建另一个字符串。.join() 只创建一个字符串。 - Andrew Gorcester
1
无论如何填补“间隙”,仍需要创建n个新字符串,除了最后一个字符串外,其余都是临时的,这是由于AST中+运算符重载的简单扩展和处理方式所致。 - Preet Kukreti
啊,现在你这么说我就明白多了,我想是有什么东西点亮了 :) - Inbar Rose
1
@InbarRose 另外,Py_MEMCPY(p, sep, seplen);''.join 的情况下会对长度为0的 seplen 进行 memcpy,因此实际上不会复制任何内容。 - jamylak
显示剩余3条评论

2

我认为你过于复杂化了。以下是来自Python官方的内容:

>>> list = ['h', 'e', 'l', 'l', 'o']
>>> sum(list, '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

因此,Python 的建议是使用 ''.join

这是不是OP想要的。他想将一个字符串列表转换为单个字符串,该字符串由列表中的所有字符串组成。 - Inbar Rose
@InbarRose 这是以前做这件事的旧方法。 - jamylak
嗯,我刚刚回答了一个关于Python的问题(将字符串列表转换为字符串)。 - Vladimir

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