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 thread 并发且顺序运行示例
Apr 09 Python
Python中的下划线详解
Jun 24 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
PyCharm代码格式调整方法
May 23 Python
Python中偏函数用法示例
Jun 07 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
基于python实现上传文件到OSS代码实例
May 09 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
Django解决frame拒绝问题的方法
Dec 18 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 从数据库提取二进制图片的处理代码
2009/09/09 PHP
mysql总结之explain
2012/02/27 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
如何提高数据访问速度
2016/12/26 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
python实现统计代码行数的方法
2015/05/22 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
中国梦口号
2014/06/13 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
七夕情人节问候语
2015/11/11 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers