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 相关文章推荐
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
python3实现windows下同名进程监控
Jun 21 Python
Python 变量类型详解
Oct 10 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
python 字典和列表嵌套用法详解
Jun 29 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
文件上传的实现
2006/10/09 PHP
相对路径转化成绝对路径
2007/04/10 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
vue 页面跳转的实现方式
2021/01/12 Vue.js
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
python处理xml文件的方法小结
2017/05/02 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
Python实现石头剪刀布游戏
2021/01/20 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
马来西亚网上购物:Youbeli
2018/03/30 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
思想政治教育专业个人求职信范文
2013/12/20 职场文书
中国好声音华少广告词
2014/03/17 职场文书
机关办公室岗位职责
2014/04/16 职场文书
个人党性锻炼总结
2015/03/05 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL