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 与GO中操作slice,list的方式实例代码
Mar 20 Python
Python存取XML的常见方法实例分析
Mar 21 Python
python爬虫使用cookie登录详解
Dec 27 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
python实现图片筛选程序
Oct 24 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Django跨域请求原理及实现代码
Nov 14 Python
PyTorch中的torch.cat简单介绍
Mar 17 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
PHP中常用数组处理方法实例分析
2008/08/30 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python中关于使用模块的基础知识
2015/05/24 Python
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python对html过滤处理的方法
2018/10/21 Python
python pygame实现2048游戏
2018/11/20 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
基于Python的OCR实现示例
2020/04/03 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
聚美优品励志广告词
2014/03/14 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
javascript对象3个属性特征
2021/11/17 Javascript
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis