Convert a list of characters into a string
如果我有字符列表:
如何将其转换为单个字符串?
号
使用空字符串的join方法将所有字符串与中间的空字符串连接在一起,如下所示:
1 2 3
| >>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd' |
- 如何在字符之间添加空格?不管怎样,在不重复整个过程的情况下完成它?
- 只需在引号之间加一个空格就可以了。
- 这方面的一个好处是,您可以使用''.如果您想用每个项目的新行将一个列表写入一个txt,请加入(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"。
这在JavaScript或Ruby中有效,为什么不在Python中有效呢?
1 2 3 4
| >>> ['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类上:
1 2
| # this is the Python way
"".join(['a','b','c','d']) |
有点奇怪,不是吗?为什么join不是list对象中的方法,就像在javascript或其他流行的脚本语言中一样?这是Python社区如何思考的一个例子。因为join返回一个字符串,所以它应该放在string类中,而不是列表类中,所以str.join(list)方法意味着:使用str作为分隔符将列表加入到一个新的字符串中(在这种情况下,str是一个空字符串)。
不知怎么的,过了一会儿我就爱上了这种思维方式。在Python设计中,我可以抱怨很多事情,但不能抱怨它的一致性。
- 联接是字符串方法而不是列表方法的主要原因是它接受任何ITerable,而不仅仅是列表。您可以使用生成器表达式、字典、集合、各种视图等。所以在大多数语言中,它比数组连接操作灵活得多。
- 我将python的string.join()与大多数在许多动态语言中使用join()方法的集合进行了比较。关于iterables,我想这类语言不存在问题,因为将iterables包含在集合构造函数中和join()方法中的链中是容易(且易读)的。
- 是的,假设它们要么有懒惰的列表(haskell风格),要么在开始之前您可以将列表合并到内存中。我的观点是,Python的工作方式不是任意的,它有很好的理由。
- 它不是任意的,它是一个设计决策,以避免在每个类中的名称空间污染。-)
- 确切地。另外,并不是所有的类都是偶数类。"iterable"是一个协议,而不是类。您可以使用任何ITerable过滤、映射、联接等。
如果您的python解释器是旧的(例如,1.5.2,这在一些旧的Linux发行版上很常见),那么您可能没有可用的join()作为任何旧字符串对象的方法,而您将需要使用字符串模块。例子:
1 2 3 4 5 6 7 8
| a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '') |
字符串b将是'abcd'。
这可能是最快的方法:
1 2 3 4
| >> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd' |
。
- 你真的做过基准测试吗?如果再快一点,我会很惊讶的
- @Winstonewert是的,昨天我写了一个程序,需要做这样的事情,我在程序中为这行的性能测试了几种方法,结果显示它比''.join(['a','b','c'])快20%。
- 我自己的标杆节目"加入"要快7倍。pastebin.com/8nsc5ek1。你介意分享你的基准吗?
- @你说得对。我发现了原因:在我的程序中,我从网络中接收到一个int列表,然后转换为字符串,其中map(ord,a)是不必要的,但join需要map(chr,a)。这是我的基准pastebin.com/1skfm8ma
- 啊,完全有道理
- 下次在ideone.com上上传你的基准测试:)
- 过早优化。这太难理解了。除非用户在操作中需要性能,否则简单的''.join()更易于阅读。
- 不同意——程序员需要为这些事情记住最快的方法。一个简单的操作只要花费一点时间就没什么大不了的了。然而,这就是为什么每一个编写的程序最终都会膨胀并占用太多资源。当我们不把自己放在尽可能精益的习惯中时,我们最终的世界就像…好吧,像WindowsVista,或者Linux的新贵,都是很多导致"膨胀和漂浮"的捷径的好例子,就像死在水里一样。他们两个都很丑。为什么不使用str().join(a),它100%表示imfho。
- …但我仍然会用简单的一个做愚蠢的小实验,另一个做需要速度的重要实验。我只是说,我们应该养成适当宽恕这种事情的习惯。
reduce功能也起作用
1 2 3 4
| 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),因为在python中,apply已被正式否决,取而代之的是扩展调用语法(aka en.wikipedia.org/wiki/variadic_函数)。
使用带空分离器的join。
1 2
| h = ['a','b','c','d','e','f']
print ''.join(h) |
或使用reduce与add运算符
1 2 3
| import operator
h=['a','b','c','d']
reduce(operator.add, h) |
。
1 2 3 4 5 6 7
| h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef' |
。
- 这会很慢。使用''.join(h)将远远超过一个附加方法。
- 在《Python圣经》(即1400多页的第一页)中,在许多地方,它告诉我们这样做是错误的,应该尽可能避免。这也是一个痛苦明显的未经训练的python初学者的商标(不是侮辱功能……好吧),它可能会起作用,但你会听到大约5000人说"不要这样做"。
如果列表中包含数字,则可以使用map()和join()。
如:
1 2 3 4
| arr = [3, 30, 34, 5, 9]
''.join(map(str,arr))
>> 3303459 |
号
- 使用''.join([str(i) for i in arr])实际上更像是一种Python。
- @用户1767754好吧,guido喜欢这种风格,但是使用map函数绝对没有问题。
- @它的布鲁斯没有什么问题,它可能是更好的阅读和地图。
除了最自然的方法str.join外,还有一种可能是使用io.StringIO和滥用writelines一次性编写所有元素:
1 2 3 4 5 6 7
| import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue()) |
号
印刷品:
号
当将此方法用于生成器函数或不属于tuple或list的iterable时,它节省了join所做的临时列表创建,一次即可分配正确的大小(1个字符字符串的列表在内存方面非常昂贵)。
如果您的内存不足,并且有一个延迟计算的对象作为输入,那么这种方法是最好的解决方案。
您也可以这样使用operator.concat():
1 2 3 4
| >>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd' |
号
如果您使用的是python 3,则需要预先准备:
1
| >>> from functools import reduce |
号
由于内置的reduce()已从python 3中删除,现在位于functools.reduce()。
1 2 3 4
| str = ''
for letter in a:
str += letter
print str |
。
- @丹妮莱克辛斯基加上它的阴影,埃多克斯1(0)内置…
1 2 3 4 5
| g = ['a', 'b', 'c', 'd']
f=''
for i in range(0,len(g)):
f=f+g[i]
print f |
- -1,这比现有答案更不清楚,更详细。
- +1对我有用,因为我需要跳过列表中的一些元素。
- 史蒂夫:这就是理解的目的:)
- 像地狱一样不完美,并且具有二次复杂性。尝试10000000个元素列表。