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 调用DLL操作抄表机
Jan 12 Python
python3.3使用tkinter开发猜数字游戏示例
Mar 14 Python
Python获取系统默认字符编码的方法
Jun 04 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
numpy matrix和array的乘和加实例
Jun 28 Python
python3 map函数和filter函数详解
Aug 26 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python小白不正确的使用类变量实例
May 29 Python
flask开启多线程的具体方法
Aug 02 Python
浅析python实现动态规划背包问题
Dec 31 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 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函数代码
2010/04/22 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
读jQuery之八 包装事件对象
2011/06/21 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python中pass语句用法实例分析
2015/04/30 Python
详解python中的文件与目录操作
2017/07/11 Python
python实现大转盘抽奖效果
2019/01/22 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
捐书活动总结
2014/05/04 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
导游词之唐山景点
2019/12/18 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL