将字符列表转换为字符串[重复]
Posted
技术标签:
【中文标题】将字符列表转换为字符串[重复]【英文标题】:Convert a list of characters into a string [duplicate] 【发布时间】:2011-05-27 18:33:20 【问题描述】:如果我有一个字符列表:
a = ['a','b','c','d']
如何将其转换为单个字符串?
a = 'abcd'
【问题讨论】:
Link to other direction 【参考方案1】:使用空字符串的join
方法将所有字符串与中间的空字符串连接在一起,如下所示:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
【讨论】:
如何在字符之间添加空格?无论如何要在不遍历整个事情的情况下做到这一点? 只需在' '.join(list)
之间加一个空格即可
这样做的好处是,如果您想将列表写入 txt 并为每个项目添加新行,您可以使用 '\n'.join(a)
澄清一下:"".join(['a','b','c'])
表示Join all elements of the array, separated by the string ""
。同理," hi ".join(["jim", "bob", "joe"])
会创建"jim hi bob hi joe"
。
@DanielStutzbach 这太天才了。谢谢!仍然有效,Python3x - 2021!【参考方案2】:
这适用于许多流行的语言,如 javascript 和 Ruby,为什么不适用于 Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
很奇怪,在 Python 中,join
方法在 str
类上:
# this is the Python way
"".join(['a','b','c','d'])
为什么 join
不是 list
对象中的方法,就像 JavaScript 或其他流行脚本语言中的方法一样?这是 Python 社区如何思考的一个例子。由于join是返回一个字符串,所以应该放在string类中,而不是放在list类中,所以str.join(list)
方法的意思是:用str
作为分隔符将list加入到一个新的字符串中(本例中为@987654329 @ 是一个空字符串)。
不知何故,一段时间后我开始喜欢这种思维方式。我可以抱怨 Python 设计中的很多事情,但不能抱怨它的连贯性。
【讨论】:
join 是字符串方法而不是列表方法的主要原因是它接受任何可迭代,而不仅仅是列表。您可以使用生成器表达式、字典、集合、各种视图等。所以它比大多数语言中的数组连接操作灵活得多。 我将 Python 的string.join()
与在许多动态语言中具有 join()
方法的大多数集合进行比较。关于可迭代对象,我想这对此类语言来说不是问题,因为将可迭代对象包含在集合构造函数中并在join()
方法中链接起来同样容易(且清晰)。
是的,假设他们要么有惰性列表(Haskell 风格),要么你很乐意在开始之前将列表合并到内存中。我的观点是 Python 的做法不是随意的,它有很好的理由。
这不是任意的,它是一个设计决定,以避免每个类中的命名空间污染。 :-)
没错。另外,并非所有这些都是类——“可迭代”是一个协议,而不是一个类。您可以使用任何可迭代对象进行过滤、映射、连接等。【参考方案3】:
如果您的 Python 解释器较旧(例如 1.5.2,这在一些较旧的 Linux 发行版中很常见),您可能没有 join()
可用作任何旧字符串对象的方法,而是需要使用字符串模块。示例:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
字符串b
将是'abcd'
。
【讨论】:
【参考方案4】:这可能是最快的方式:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
【讨论】:
@WinstonEwert 是的,昨天我正在编写一个需要做这种事情的程序,我在我的程序中对这个行数的性能进行了一些基准测试,结果显示它快了大约 20%然后''.join(['a','b','c'])
我自己的基准测试显示 join 快了 7 倍。 pastebin.com/8nSc5Ek1。您介意分享您的基准吗?
@WinstonEwert 你是对的。我找到了原因:在我的程序中,我从网络接收一个 int 列表,然后转换为字符串,其中 map(ord,a)
是不必要的,但加入需要 map(chr,a)
。这是我的基准pastebin.com/1sKFm8ma
过早优化。这很难阅读和理解发生了什么。除非用户在操作中需要性能,否则简单的''.join()
更具可读性。
不同意——程序员需要记住最快的方法来处理这些事情。一个简单的操作需要更长的时间,这没什么大不了的。然而,这就是几乎每个编写的程序最终都会变得臃肿并占用太多资源的原因。当我们不养成使事情尽可能精简的习惯时,我们最终会得到一个类似的世界......好吧,就像 Windows Vista 或 Linux 中的 Upstart 是许多小捷径的好例子,这些捷径导致'膨胀和漂浮',就像死在水中一样。他们也很丑。为什么不使用 str().join(a),它是 100% 富有表现力的 imfho..【参考方案5】:
reduce 函数也有效
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
【讨论】:
运营商本身并不是一等公民,这总是让我感到困扰。例如,在方案中,这将是 (reduce + h) 在方案中,(reduce + '' h)
或 (apply + h)
可以工作。但是话又说回来,在 Python 中,add 运算符正好采用 2 个操作数,因此需要 reduce。否则,您可以使用operator.add(*h)
,因为apply
在Python 中已被正式弃用,取而代之的是扩展调用语法(又名en.wikipedia.org/wiki/Variadic_function)【参考方案6】:
如果列表包含数字,您可以使用map()
和join()
。
例如:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
【讨论】:
使用''.join([str(i) for i in arr])
其实更pythonic
@user1767754 好吧,Guido 更喜欢这种风格,但使用地图功能绝对没有错。【参考方案7】:
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
【讨论】:
这会很慢。使用''.join(h)
将远远超过您的一对一追加方法。
在“python 圣经”(第一页 1400 多页)中,在许多地方它告诉我们这样做是错误的,应尽可能避免。它也是不知情的 python 初学者的一个痛苦的明显商标(不是侮辱功能......好吧)它可能有效,但你会听到大约 5000 人的“不要这样做”。
这被称为Shlemiel the painter’s algorithm,但公平地说,在此页面上使用reduce
的许多更奇葩的答案都是一样的。【参考方案8】:
除了str.join
是最自然的方式之外,还有一种可能是使用io.StringIO
和滥用writelines
一次性写入所有元素:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
打印:
abcd
当将此方法与生成器函数或不是tuple
或list
的可迭代对象一起使用时,它会保存join
为一次性分配正确大小而创建的临时列表(以及1 个字符的字符串列表在内存方面非常昂贵)。
如果您的内存不足并且您有一个惰性求值的对象作为输入,那么这种方法是最好的解决方案。
【讨论】:
【参考方案9】:你也可以像这样使用operator.concat()
:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
如果您使用的是 Python 3,则需要预先添加:
>>> from functools import reduce
因为内置的 reduce()
已从 Python 3 中删除,现在位于 functools.reduce()
中。
【讨论】:
以上是关于将字符列表转换为字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章