下标、切片、字符串常见操作
首次发布时间:2020/7/28
最后修改时间:2020/7/28
本系列文章基于 python3 版本
摘要
- 下标、切片
- 字符串常见操作
- find()
- index()
- count()
- replace()
- split()
- strip()
下标、切片
书架上有 6 本书,从左到右放好,书名分别是:【西西弗神话,维特根斯坦传,苏菲的世界,西方哲学史讲演录,查拉图斯特拉如是说,哲学的故事】
给书编好号,从左到右分别是:【1,2,3,4,5,6】
下标
- 上面所说的书的编号,在程序中就是所谓的下标
- 但是一般来说,在程序中,下标都是从 0 开始的
- 所以对于程序来讲,书的编号应该改为:【0,1,2,3,4,5】
- 示意图:
书名 | 西西弗神话 | 维特根斯坦传 | 苏菲的世界 | 西方哲学史讲演录 | 查拉图斯特拉如是说 | 哲学的故事 |
---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
- 我们可以从第一本书开始看起
- 也可以随便拿其中一本来看
- 那这个过程用程序如何模拟呢?
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print("读一下 《" + str_list[2] + "》")
- 输出结果:
读一下 《苏菲的世界》
所以说,程序中的下标对应着相应的书
再次注意下:
在程序中,下标是从 0 开始的
比如要拿《西西弗神话》,则要用 str_list[0]
这是初学者容易犯错的地方,熟悉了就好了
切片
- 如果你想拿其中的第 2、3 本书,程序应该怎么实现?
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print(str_list[1:3:1])
- 输出结果:
['维特根斯坦传', '苏菲的世界']
-
切片的语法:[起始:结束:步长]
- 起始:开始的位置(下标)
- 上面的例子中,起始是 1,这里说的是下标
- 所以第一个取的是 《维特根斯坦传》,因为它的下标就是 1
- 结束:想取的最后一个元素的序号
- 注意,这里是说序号,不是下标,序号是 3,上面的例子中对应的就是 《苏菲的世界》
- 步长:取元素时隔几个取
- 比如步长是 1 的时候,就取完一个元素,再继续取紧接着它的下一个元素(像上面的例子)
- 如果步长是 2 的时候,就取完一个元素,然后隔一个元素再取(比如我第一个取的是**《西西弗神话》,下一个取的是《苏菲的世界》**)
- 其它步长值如此类推
- 起始:开始的位置(下标)
-
使用示例:
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print(str_list[0:4:])
print(str_list[0:5:])
print(str_list[0:5:1])
print(str_list[0:5:2])
print(str_list[0:5:3])
- 输出结果:
['西西弗神话', '维特根斯坦传', '苏菲的世界', '西方哲学史讲演录']
['西西弗神话', '维特根斯坦传', '苏菲的世界', '西方哲学史讲演录', '查拉图斯特拉如是说']
['西西弗神话', '维特根斯坦传', '苏菲的世界', '西方哲学史讲演录', '查拉图斯特拉如是说']
['西西弗神话', '苏菲的世界', '查拉图斯特拉如是说']
['西西弗神话', '西方哲学史讲演录']
从输出结果看,当不填入步长时,其实默认的步长是 1
如果想从后往前拿书:
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print(str_list[::-1])
print(str_list[-1:-3:-1])
- 输出结果:
['哲学的故事', '查拉图斯特拉如是说', '西方哲学史讲演录', '苏菲的世界', '维特根斯坦传', '西西弗神话']
['哲学的故事', '查拉图斯特拉如是说']
str_list[-1:-3:-1]
需要特别解释一下:
- 最后的步长 -1,就是表示从后往前取元素。
- 在步长是 -1 的情况下,-1 表示从后往前第一个元素的下标
- 所以起始的 -1 表示 《哲学的故事》,-2 表示 《查拉图斯特拉如是说》,依此类推。
- 而结束的 -3,实际输出到《查拉图斯特拉如是说》结束了,而《查拉图斯特拉如是说》的下标是 -2
- 所以我们可以理解为 结束 处的值是最后输出元素的下一个
- 代码示例:
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print(str_list[0:2]) # 取出下标是 0、1 的书
print(str_list[0:4]) # 取出线标为 0~3 的书
print(str_list[1:]) # 取出下标为 1 及其之后的书
# 取出下标为 1 的书到最后一本书之间的书(包括下标为 1 的书,不包括最后一本书)
print(str_list[1:-1])
# 从后向前拿书
print(str_list[::-1])
# 取最后一本书
print(str_list[-1:])
- 输出结果:
['西西弗神话', '维特根斯坦传']
['西西弗神话', '维特根斯坦传', '苏菲的世界', '西方哲学史讲演录']
['维特根斯坦传', '苏菲的世界', '西方哲学史讲演录', '查拉图斯特拉如是说', '哲学的故事']
['维特根斯坦传', '苏菲的世界', '西方哲学史讲演录', '查拉图斯特拉如是说']
['哲学的故事', '查拉图斯特拉如是说', '西方哲学史讲演录', '苏菲的世界', '维特根斯坦传', '西西弗神话']
['哲学的故事']
思考
- 怎么取出 [‘西方哲学史讲演录’, ‘苏菲的世界’, ‘维特根斯坦传’] 呢?
str_list = ["西西弗神话", "维特根斯坦传", "苏菲的世界", "西方哲学史讲演录", "查拉图斯特拉如是说", "哲学的故事"]
print(str_list[-3:-6:-1])
- 输出结果:
['西方哲学史讲演录', '苏菲的世界', '维特根斯坦传']
字符串常见操作
find
- 有时一串字符串比较长,需要从中找出某一段内容的位置
- 这时候就需要用到 find 函数
- 假设有一个字符串:sentence = "But it’s time to face the truth. I will never be with you"
sentence = "But it's time to face the truth. I will never be with you"
print(sentence.find('truth'))
print(sentence.find('truth', 28, len(sentence)))
- 输出结果:
26
-1
- 为什么一个是 26,一个是 -1?
- find() 函数是在 sentence 中查找 “truth” 字段
- 能找到就返回第一个字符的索引值(这里的例子就是返回第一个 “t” 的索引值 26,即下标),否则返回 -1
- 例子中第一个 find 是在整个字符串中找,所以能找到,并返回相应的索引值
- 例子中第二个 find 是从字符串下标为 28 的地方开始找到结尾处,所以找不到 “truth” 字段,所以返回了 -1
- find() 函数是在 sentence 中查找 “truth” 字段
index
- 和 find() 的作用一样,但如果找不到字符串会报错
sentence = "But it's time to face the truth. I will never be with you"
print(sentence.index('truth'))
print(sentence.index('truth', 28, len(sentence)))
- 输出结果:
26
Traceback (most recent call last):
File "test.py", line 5, in <module>
print(sentence.index('truth', 28, len(sentence)))
ValueError: substring not found
count
- 统计指定字符/字符串出现的次数
sentence = "But it's time to face the truth. I will never be with you"
print(sentence.count('t'))
- 输出结果:
8
replace【替换】
- 格式:
字符串.replace(要替换的字符,用哪个字符替换,替换不超过多少次【<=】)
sentence = "But it's time to face the truth. I will never be with you"
print(sentence.replace('t', 'T', 4))
- 输出结果:
BuT iT's Time To face the truth. I will never be with you
- 结果就是,前四个 ‘t’,被替换为了 'T’
split【切片】
- 格式:
split(“切割符”,[次数]) # [] 为可选参数
返回一个列表
sentence = "But it's time to face the truth. I will never be with you"
print(sentence.split(' ')) # 默认切割整个句子
print(sentence.split(' ', 2)) # 最多切割 2 次
print(sentence.split()) # 默认按 空格、'\t'、'\n' 切割
- 输出结果:
['But', "it's", 'time', 'to', 'face', 'the', 'truth.', 'I', 'will', 'never', 'be', 'with', 'you']
['But', "it's", 'time to face the truth. I will never be with you']
['But', "it's", 'time', 'to', 'face', 'the', 'truth.', 'I', 'will', 'never', 'be', 'with', 'you']
strip【删除字符串两端的空白字符】
- 格式:
word.strip([chars])
chars – 移除字符串头尾指定的字符序列
sentence = " But it's time to face the truth. I will never be with you "
print(sentence.strip(" "))
print(sentence.strip()) # 默认移除 空格、'\t'、'\n'
- 输出结果:
But it's time to face the truth. I will never be with you
But it's time to face the truth. I will never be with you
- 还有将近 20 个函数没有列出,因为不太常用
思考
- 给定一个字符串,a = “abcdefg \t hijklmn \t opqrst uvwxyz”
- 打印用 ‘\t’ 或者 空格 分隔的倒数第二个字符串
a = "abcdefg \t hijklmn \t opqrst uvwxyz"
b = a.split() # 以空格为分隔符,包括 '\t'
print(b)
print(b[-2:-3:-1])
- 输出结果:
['abcdefg', 'hijklmn', 'opqrst', 'uvwxyz']
['opqrst']
当 split() 没加任何参数时,默认是以 空格、’\t’、’\n’ 做分隔符