Python 合并拼接字符串的方法


Posted in Python onJuly 28, 2020

问题

你想将几个小的字符串合并为一个大的字符串

解决方案

如果你想要合并的字符串是在一个序列或者 iterable 中,那么最快的方式就是使用 join() 方法。比如:

>>> parts = ['Is', 'Chicago', 'Not', 'Chicago?']
>>> ' '.join(parts)
'Is Chicago Not Chicago?'
>>> ','.join(parts)
'Is,Chicago,Not,Chicago?'
>>> ''.join(parts)
'IsChicagoNotChicago?'
>>>

初看起来,这种语法看上去会比较怪,但是 join() 被指定为字符串的一个方法。这样做的部分原因是你想去连接的对象可能来自各种不同的数据序列(比如列表,元组,字典,文件,集合或生成器等),如果在所有这些对象上都定义一个 join() 方法明显是冗余的。因此你只需要指定你想要的分割字符串并调用他的 join() 方法去将文本片段组合起来。

如果你仅仅只是合并少数几个字符串,使用加号(+)通常已经足够了:

>>> a = 'Is Chicago'
>>> b = 'Not Chicago?'
>>> a + ' ' + b
'Is Chicago Not Chicago?'
>>>

加号(+)操作符在作为一些复杂字符串格式化的替代方案的时候通常也工作的很好,比如:

>>> print('{} {}'.format(a,b))
Is Chicago Not Chicago?
>>> print(a + ' ' + b)
Is Chicago Not Chicago?
>>>

如果你想在源码中将两个字面字符串合并起来,你只需要简单的将它们放到一起,不需要用加号(+)。比如:

>>> a = 'Hello' 'World'
>>> a
'HelloWorld'
>>>

讨论

字符串合并可能看上去并不需要用一整节来讨论。但是不应该小看这个问题,程序员通常在字符串格式化的时候因为选择不当而给应用程序带来严重性能损失。

最重要的需要引起注意的是,当我们使用加号(+)操作符去连接大量的字符串的时候是非常低效率的,因为加号连接会引起内存复制以及垃圾回收操作。特别的,你永远都不应像下面这样写字符串连接代码:

s = ''
for p in parts:
  s += p

这种写法会比使用 join() 方法运行的要慢一些,因为每一次执行+=操作的时候会创建一个新的字符串对象。你最好是先收集所有的字符串片段然后再将它们连接起来。

一个相对比较聪明的技巧是利用生成器表达式(参考1.19小节)转换数据为字符串的同时合并字符串,比如:

>>> data = ['ACME', 50, 91.1]
>>> ','.join(str(d) for d in data)
'ACME,50,91.1'
>>>

同样还得注意不必要的字符串连接操作。有时候程序员在没有必要做连接操作的时候仍然多此一举。比如在打印的时候:

print(a + ':' + b + ':' + c) # Ugly
print(':'.join([a, b, c])) # Still ugly
print(a, b, c, sep=':') # Better

当混合使用I/O操作和字符串连接操作的时候,有时候需要仔细研究你的程序。比如,考虑下面的两端代码片段:

# Version 1 (string concatenation)
f.write(chunk1 + chunk2)

# Version 2 (separate I/O operations)
f.write(chunk1)
f.write(chunk2)

如果两个字符串很小,那么第一个版本性能会更好些,因为I/O系统调用天生就慢。另外一方面,如果两个字符串很大,那么第二个版本可能会更加高效,因为它避免了创建一个很大的临时结果并且要复制大量的内存块数据。还是那句话,有时候是需要根据你的应用程序特点来决定应该使用哪种方案。

最后谈一下,如果你准备编写构建大量小字符串的输出代码,你最好考虑下使用生成器函数,利用yield语句产生输出片段。比如:

def sample():
  yield 'Is'
  yield 'Chicago'
  yield 'Not'
  yield 'Chicago?'

这种方法一个有趣的方面是它并没有对输出片段到底要怎样组织做出假设。例如,你可以简单的使用 join() 方法将这些片段合并起来:

text = ''.join(sample())

或者你也可以将字符串片段重定向到I/O:

for part in sample():
  f.write(part)

再或者你还可以写出一些结合I/O操作的混合方案:

def combine(source, maxsize):
  parts = []
  size = 0
  for part in source:
    parts.append(part)
    size += len(part)
    if size > maxsize:
      yield ''.join(parts)
      parts = []
      size = 0
    yield ''.join(parts)

# 结合文件操作
with open('filename', 'w') as f:
  for part in combine(sample(), 32768):
    f.write(part)

这里的关键点在于原始的生成器函数并不需要知道使用细节,它只负责生成字符串片段就行了。

以上就是Python 合并拼接字符串的方法的详细内容,更多关于Python 合并拼接字符串的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现身份证号码解析
Sep 01 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python单元测试与测试用例简析
Nov 09 Python
Python集合操作方法详解
Feb 09 Python
Python网页解析器使用实例详解
May 30 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
django使用channels实现通信的示例
Oct 19 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 Python
Python reques接口测试框架实现代码
Jul 28 #Python
如何用Matplotlib 画三维图的示例代码
Jul 28 #Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 #Python
Python同时迭代多个序列的方法
Jul 28 #Python
Python如何读取、写入JSON数据
Jul 28 #Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 #Python
Python基于xlutils修改表格内容过程解析
Jul 28 #Python
You might like
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php基本函数汇总
2015/07/09 PHP
纯php生成随机密码
2015/10/30 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
javascript 精粹笔记
2010/05/09 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
Python基于有道实现英汉字典功能
2015/07/25 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
浅析python的Lambda表达式
2019/02/27 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python suds访问webservice服务实现
2020/06/26 Python
python 读取.nii格式图像实例
2020/07/01 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
半年思想汇报
2013/12/30 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
老公爱的承诺书
2014/03/31 职场文书
护林防火标语
2014/06/27 职场文书
重阳节活动主持词
2015/07/04 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
Python制作春联的示例代码
2022/01/22 Python