Pythonic 列表转字符串方法
Posted
技术标签:
【中文标题】Pythonic 列表转字符串方法【英文标题】:Pythonic list to string method 【发布时间】:2012-08-02 17:45:01 【问题描述】:所以我想知道将列表转换为字符串的最“pythonic”方式是什么。
例如:
string_list = ['h', 'e', 'l', 'l', 'o']
# to the string
string = 'hello'
我一直在使用''.join(string_list)
方法,但它只是感觉几乎无法阅读和迂回的方法来做如此简单的事情。
有没有更好的方法,还是我把它复杂化了?
【问题讨论】:
信不信由你,这是可读的方式,但它也有点像python。''.join(list)
已经是一个非常pythonic的方式了,你在寻找更好的效率吗?
另外注意,不要调用你的列表list
,你正在隐藏内置函数。
是的,这不是效率问题,只是让我觉得很难看。但如果它是通常的方式!
@InbarRose 这是最有效的方法
【参考方案1】:
不,这是pythonic的方式。
也许你觉得应该写成:string_list.join('')
。你是not alone。
可能最重要的优势是,这使得.join()
可以与任何可迭代的东西一起工作。
如果反过来,每个集合都需要自己实现一个join()
方法。如果您要创建自己的集合,您会添加.join()
方法吗?应该不会吧。
它是str
类的一个方法,这意味着它总是工作。没有惊喜。在Python and the principle of least astonishment 上阅读有关join()
和Flask
作者Armin Ronacher 的其他内容。
可以为len()
函数/运算符提出类似的论点,可以在上述文章的开头找到。
【讨论】:
离题评论提醒。来自(优秀的)链接文章:“装饰器有点痛苦,因为 @foo 和 @foo() 之间存在差异。如果它们以前者意味着后者的方式声明,我们现在都会更快乐。每次我想给一个以前无参数的装饰器引入一个参数时,我都想用棍子打自己和装饰器 PEP 的作者。”哈哈。确实!【参考方案2】:使用''.join(string_list)
。请注意,list
命名了一个内置类型,因此您不应该将它用于变量名称。由于 Python 字符串是不可变的,因此无论如何都需要构造一个新字符串。 ''.join(s)
是在 Python 中执行此操作的规范且有效的方法。
【讨论】:
没有更有效的方法吗?因为我一直认为''.join(s)
就像写s[0]+''+s[1]+''+s[2]+''+s[3]...s[x]
?
@InbarRose +
方法创建 n
临时副本。 str.join
方法在单个预传递中保留所需的空间。因此,.join
方法在不平凡的情况下会胜过幼稚的+
运算符,尤其是在有很多字符串要加入的情况下
.join()
字符串方法实际上是 Python 中组装多部分字符串的最有效方法。字符串添加很慢,因为它创建了许多字符串:首先它创建s[0]+''
,然后在生成的字符串中添加s[1]
以创建另一个。 .join()
只创建一个字符串。
@InbarRose 不管如何填充“间隙”,n
仍然需要创建新字符串,除了最后一个之外的所有字符串都是临时的,因为+
运算符重载的简单方式在 AST 中扩展和处理
@InbarRose 此外,Py_MEMCPY(p, sep, seplen);
将在 ''.join
的情况下对 0 的 seplen 执行 memcpy,因此实际上不会复制任何内容。【参考方案3】:
我认为你过于复杂了。这是来自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 所要求的。他想将字符串列表转换为由列表中所有字符串组成的单个字符串。 @InbarRose 这是旧的做法 嗯,我刚刚就给定的问题提供了 python 答案(将字符串列表转换为字符串)。以上是关于Pythonic 列表转字符串方法的主要内容,如果未能解决你的问题,请参考以下文章