2.14 合并拼接字符串

问题

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

解决方案

如果你想要合并的字符串是在一个序列或者 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)

这里的关键点在于原始的生成器函数并不需要知道使用细节,它只负责生成字符串片段就行了。

微信公众账号.jpg

python合并两个字符串_【Python进阶】2.14 合并拼接字符串相关推荐

  1. java 合并两个列表_如何在Java中合并两个列表?

    java 合并两个列表 Merging two lists in Java is often a useful operation. These lists can be ArrayLists or ...

  2. 【Python】青少年蓝桥杯_每日一题_12.03_输出字符串的长度

    用心写好每一篇文章 一.题目背景 本题是Python编程问题,出现在2020年9月的STEMA考试中. 二.编程实现 输入一个字符串(N),输出该字符串的长度. 输入描述:输入一个字符串N 输出描述: ...

  3. python如何检验显著性差异_[Python] 如何证明两组样本有显著性差异(t-test假设检验) | 学步园...

    现有两组样本数据,假如它们分别基于两套不同的方法,或者测于不同的设备,又或是出自两个人之手,如何证明它们有或没有显著性差别呢?当然可以拿个Excel表把数据画个图,然后找一堆人来投票,看觉得差不多还是 ...

  4. 合并两个有序数组Python解法

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nums2 到 nums1 中,使合并 ...

  5. python索引右往左_[Python笔记]序列(一)索引、分片

    Python包含6种内建序列:列表.元组.字符串.Unicode字符串.buffer对象.xrange对象. 这些序列支持通用的操作: 索引 索引是从0开始计数:当索引值为负数时,表示从最后一个元素( ...

  6. 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集

    python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...

  7. python爬虫课程设计过程_[Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  8. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  10. 用Python实现两数之和(python)

    用Python实现两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不 ...

最新文章

  1. Zotero科研文献管理 - 将PDF文件同步到Google Driver中,不同电脑无缝使用
  2. 懒人 IDEA 插件推荐: EasyCode 一键帮你生成所需代码~
  3. 蒙特卡洛积分与重要性采样详解
  4. boost::filesystem模块实现相对文件系统的测试程序
  5. 解决mac升级后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误
  6. .netcore 堆栈调用方法小记
  7. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  8. 了解Docker、Ubuntu20.04安装docker教程
  9. php preg_split 正则截取字符串
  10. 【Zookeeper系列】Zookeeper命令操作(转)
  11. 诺禾--分子生物学常用小软件分享
  12. React 实现 PDF 文件在线预览 - 手把手教你写 React PDF 预览功能
  13. 计算机课做名片怎么做,第7课制作个人小名片(教学设计)
  14. 裸金属服务器跟云服务器区别有哪些?裸金属应用在哪些场景中?
  15. LeetCode--第25题K个一组翻转链表
  16. 微信公众号的代码块插入,及一键排版
  17. 怎样学习C语言——快速上手C语言系列之—什么是指针
  18. c语言中文网严长生,2.shell语法:shell变量定义和使用
  19. redis 常用命令
  20. 自适应模糊神经网络的设计

热门文章

  1. Pxe + Kickstart脚本 +VMWare NAT模式 自动安装 ESXi 6.5
  2. iOS 添加字体库 —— HERO博客
  3. 录音转文字软件哪个好用?这些软件值得收藏
  4. slam 学习之 AMCL 概念与原理分析
  5. Python基础下载安装卸载
  6. IOS 编译ffmpeg For SDK6.1,模拟器、armv7、armv7s均可使用
  7. python3词法分析(三)识别token
  8. 内参(焦距)与视场角的转换关系
  9. 室内定位下的智能养老看护系统追踪报警解决方案--室内定位--新导智能
  10. Android淘宝好评星级进度条RatingBar原来可以这么玩