合并拼接字符串

问题

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

解法

如果你想要合并的字符串是在一个序列或者 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() 方法运行的要慢一些,因为每一次执行 += 操作的时候会创建一个新的字符串对象。你最好是先收集所有的字符串片段然后再将它们连接起来。

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

>>> 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 = 0for part in source:parts.append(part)size += len(part)if size > maxsize:yield ''.join(parts)parts = []size = 0yield ''.join(parts)# 结合文件操作
with open('filename', 'w') as f:for part in combine(sample(), 32768):f.write(part)

《Python Cookbook 3rd》笔记(2.14):合并拼接字符串相关推荐

  1. python合并两个字符串_【Python进阶】2.14 合并拼接字符串

    2.14 合并拼接字符串 问题 你想将几个小的字符串合并为一个大的字符串 解决方案 如果你想要合并的字符串是在一个序列或者 iterable 中,那么最快的方式就是使用 join() 方法.比如: & ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  7. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

最新文章

  1. python-MySQLdb-练习
  2. bo65连oracle报服务不响应,ORACLE常见问题一千问[1至100]
  3. 解决因为http_proxy代理导致的git clone失败的问题:OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to xxx:443
  4. VTK:绘图之CompareRandomGeneratorsCxx
  5. 微信小程序之获取验证码js
  6. 技术选型方案怎么写_活动运营方案怎么写?
  7. 从内置函数看 Python 的设计思想:len(x) 是否击败 x.len(),
  8. SecureCRT打开文件中文乱码
  9. k8s | 搞不明白为什么大家都在学习 k8s
  10. sparksql读取mysql表的两种方式
  11. linux下smtp服务器搭建
  12. Java实现压缩图片
  13. 数字内容产业的产业链结构
  14. 【繁中】Python 教學 爬蟲基礎
  15. 阿里云扩容云盘(CentOS 7系统)
  16. 局域网下两个电脑的文件实时传输--python程序
  17. 文件管理“桌面”变成“Desktop”解决方法
  18. 《量子物理史话》主线 - 光是什么?(未完)
  19. 中科院自动化所考博资料收集
  20. 一张图了解物联网技术

热门文章

  1. wince6.0编译命令分析
  2. python3界面实例_程序人生——python3下tkinter的界面示例
  3. 易语言操作php文本文件,易语言对文本操作的步骤教学
  4. 【转】1.4异步编程:轻量级线程同步基元对象
  5. c#进阶(4)—— Redis 用于消息队列的存储
  6. python猜数字1001untitled_ML - Python 基础
  7. 【iOS开发】崩溃问题汇总
  8. REVERSE-PRACTICE-BUUCTF-26
  9. 限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我
  10. 【HDU - 5468】Puzzled Elena(容斥原理,dfs序,数学,素因子分解,有坑)