参考了《Python基础教程:第3版》,也算是读书笔记,整理下来,方便回顾
在 Python 中最基本的数据结构为序列,列表、元组以及字符串是 Python 中常用的重要的序列。列表和元组的主要不同在于,列表是可以修改的,而元组不可以。这意味着列表适用于需要中途修改元素的情形,而元组适用于出与某种考虑禁止修改序列的情形。
Python 支持一种数据结构的基本概念,名为容器(container)。容器基本上就是可包含其他对象的对象。两种主要的容器是序列(例如:列表和元组)和映射(如字典)。在序列中,每个元素都有编号,而在映射中,每个元素都有名称(键)。
有几种操作适用于所有序列,包括:索引、切片、相加、相乘成员资格检查以及迭代。
string = 'python makes you happy'
print(string[0])
# 字符串就是由字符组成的序列。索引 0 指向 第一个元素。
# 不同于其他语言,Python 没有专门表示字符的类型,因此一个字符就是只包含一个元素的字符串
list1 = [2, 3, 4, 6, 1]
print(list1[-1])
# 当使用负数索引时,Python 将从右边(即最后一个元素)开始往左数,因而 -1 是最后一个元素的位置
month = ['January', 'February', 'March', 'April', 'May',
'June', 'July', 'August', 'September', 'October', 'November', 'December']
print(month[2:6])
>> ['March', 'April', 'May', 'June']
# 第一个索引是包含的第一个元素的编号
# 但第二个索引是切片后余下的第一个元素的编号
# 简而言之,两个索引来指定切片的边界,其中第一个索引指定元素包含在切片内,但第二个索引指定的元素不包含在切片内。
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers[4:10])
>> [5, 6, 7]
# numbers 这个列表的长度为 6 ,索引8取的是第 7 个元素,这个元素不存在,但依然取得 numbers 最后三个元素
print(numbers[-3:-1])
>> [5, 6]
# 可以使用负数索引
print(numbers[-3:0])
>> []
# 该结果为空, 这是因为执行索引操作时,如果第一个索引的元素位于第二个索引值得元素后边,结果为空序列
print(numbers[-3: ])
>> [5, 6, 7]
# [-3:-1] 但不包含最后一个元素,因而可以使用 [-3 :], 索引一直到结束,可以省略第二个索引
print(numbers[ :3])
>> [1, 2, 3]
# 同样切片始于序列的开头,可以省略第一个索引
执行切片操作时,常常显式或隐式地指定起点和终点,但通常省略了另一个参数,即步长。在默认情况下,步长为 1 。
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers[0:5:2])
>> [1, 3, 5]
# 指定步长为 2
print(numbers[::3])
>> [1, 4, 7]
# 显式地指定步长时,也可以简写,
print(numbers[::-2])
>> [7, 5, 3, 1]
# 也可以指定步长为负数
print(numbers[0:6:-2])
>> []
#当第二个索引的元素位于第一个索引后边时,指定步长为负数,将返回空序列
a = [2, 3, 9]
b = [1, 4, 5]
print(a + b)
>> [2, 3, 9, 1, 4, 5]
s = (1, 0, 8)
print(a + s)
>> TypeError: can only concatenate list (not "tuple") to list
# 虽然都是序列,但一般而言,不能拼接不同类型的序列
s = (1, 0, 8)
print(s * 2)
>> (1, 0, 8, 1, 0, 8)
True
;不满足时返回 False
。list1 = [1, 3, 4, 5, 6]
print(2 in list1)
>> False
print(3 in list1)
>> True
len
min
max
,其中 len
返回序列包含的元素个数,而 min
及 max
分别返回序列中的最小值与最大值nums = [222, 33, 123]
print('len', len(nums))
print('max', max(nums))
print('min', min(nums))
>> len 3
max 222
min 33
language = 'Python'
print(list(language))
>> ['P', 'y', 't', 'h', 'o', 'n']
# 可将任何序列作为list 的参数,不限于字符串
language_list = list(language)
language_list[0] = 'p'
print(''.join(language_list))
>> python
# 将字符串列表转换为字符串,
可对列表执行所有的标准序列操作,如索引、切片、拼接和相乘,但列表的有趣之处在于其是可以修改的。
列表的方法
append
用于将一个对象附加到列表的末尾clear
清空列表的内容,lst.clear()
等价于 lst[:] = []
copy
复制列表count
计算指定的元素在列表中出现的次数 lst.count(ele)
extend
能够将多个值附加到列表末尾 lst1.extend(lst2)
, 其与拼接的不同在于,这将修改 ‘lst1’ ,拼接是返回一个全新的序列index
在列表中查找指定值第一次出现的索引 lst.index(value)
,当指定元素不在列表时,会引发错误insert
用于将一个对象插入列表的指定位置 lst.insert(idx, value)
pop
从列表中删除一个元素(末尾为最后一个元素),并返回该元素 lst.pop([idx])
其中[idx]
指定时,删除该索引的元素,美誉指定时,删除列表最后一个元素。pop
实现一种常见的数据结构栈(stack),后进先出(LIFO)可以用 append
替代 push 操作。remove
由于删除第一个为指定值的元素 lst.remove(ele)
,就地修改不返回值,指定元素不在列表时,引发错误。reverse
按相反的顺序排列列表中的元素 lst.reverse()
就地修改sort
用于对列表排序。就地排序意味着对原来的列表进行修改lst.sort()
,sorted
函数排序,并返回结果 sorted(lst)
sort
方法接收两个可选的参数 key 和 reverse 。参数key,可将其设置为一个用于排序的函数。利用这个函数为裂变的每个元素创建一个键,再根据这些键对元素排序。比如一个含有字符串的列表,可将key 设置为函数len 。根据子树串的长度对元素排序。 reverse = (True\False)
指定是否按照相反顺序排序只要将一些值用逗号分隔,就能自动创建一个元组, 通常用圆括号括起来
1, 2, 3
>> (1, 2, 3)
1325,
>> (1325,)
# 创建包含一个元素的元组
函数 tuple
将一个序列作为参数,将其转换为元组。
元组的切片也是元组
所有标准序列的操作都适用于字符串。字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的
forma = 'Hello, %s is the %s language'
values = ('Python', 'best')
forma % values
>> 'Hello, Python. is the best language'
# %s 为转换说明符,指出了要将值插入到什么位置
# s 意味着将值是为字符串进行格式设置,如果指定的值不是字符串,将使用 str 强制转换
上述是一种比较旧的方法,现在用的比较多的是字符串的format
方法, 它融合了早期方法的优点。使用这种方法时,每个替换字段都使用花括号括起来,其中可能包含名称,还可能包含有关如何相应的值进行转换和格式设置的信息。
替换字段(其中每个部分都是可选的)
'good good {}, day day {}'.format('study', 'up')
>> 'good good study, day day up'
'one {1} three {2} {0}'.format('seven', 'four', 'three')
>> 'one four three three seven'
# 在最简单的情况下, 替换字段没有名称或将索引用作名称
'my name is {name}, I am {old} years old'.format(name='Bob', old=10)
>> 'my name is Bob, I am 10 years old'
# 可以给参数指定名称,注意到 old 为 int 型变量
print('{word!s} {word!r} {word!a}'.format(word='汉字'))
>> 汉字 '汉字' '\u6c49\u5b57'
# 指定转换标志,
# 函数 str 通常创建外观普通的字符串版本
# 函数 repr 尝试创建给定值的 Python 表示(这里是一个字符串字面量)
# 函数 assii 创建只包含 ASCII 字符的表示
print('My favorite number is {num}'.format(num=10))
print('My favorite number is {num:.3f}'.format(num=10))
>> My favorite number is 10
>> My favorite number is 10.000
>> My favorite number is 1010
# 可以指定需要转换的数据类型,即在冒号后边说明,也可以指定长度
字符串格式设置中的类型说明符
类型 | 含义 |
---|---|
b | 将整数表示为二进制数 |
c | 将证书解读为 Unicode 码点 |
d | 将整数视为十进制数进行处理,这是整数默认使用的说明符 |
e | 使用科学表示法来便是小数(用e来表示指数) |
E | 与 e 相同,但使用 E 来表示指数 |
f | 将小数表示为定点数 |
F | 与 f 相同,但对于特殊值 (nan 和 inf),使用大写表示 |
g | 自动在定点表示法和科学表示法之间做出选择。这是默认用于小数的说明符,默认情况下至少有 1 位小数 |
G | 与 g 相同,但使用大写表示指数和和特殊值 |
n | 与 g 相同,但插入随区域而异的数字分隔符 |
o | 将整数表示为八进制数 |
s | 字符串的说明符 |
x | 将证书表示为十六进制数并使用小写字母 |
X | 与 x 相同,但使用大写字母 |
% | 将数表示为百分比值(乘以100,按说明符 f 设置格式,再在后边加上 %) |
print(r'number:{:10}'.format(3))
print(r'string:{:10}'.format('wasd'))
>> number: 3
>> string:wasd
# 指定宽度时,字符串与数字的对齐方式不同
import math
print('pi = {:.5f}'.format(math.pi))
>> pi = 3.14159
# 精度使用整数指定,但需要在它前面加上一个表示小数点的句点
print('bigger number: {:,}'.format(31415926))
>> bigger number: 31,415,926
# 使用千分位分隔符
import math
print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(math.pi))
>>
# 运行后可看结果, 分别指定了左对齐、居中和右对齐
print("The Middle by Jimmy Eat World".center(39))
print('The Middle by Jimmy Eat World'.center(39,'-'))
>> The Middle by Jimmy Eat World
>> -----The Middle by Jimmy Eat World-----
# 方法 center 通过在两边添加填充字符(默认位空格)使字符串居中
# 相似作用的还有 ljust , rjust ,zfill
print('With a moo-moo here, and a moo-moo there'.find('moo'))
>> 7
# 方法 find 在字符串中查找子串。如果找到,返回子串的的哥字符的索引,否正返回-1
print('moo' in 'With a moo-moo here, and a moo-moo there')
>> True
# 成员资格检查也可以查找子串,返回布尔值
a = ['1', '4', '3', '3', '7', '6']
''.join(a)
>> '143376'
# join 用于合并序列的元素
'143376'.split('7')
>> ['1433', '6']
# 与 join 相反,实现分割
# lower 返回字符串小写版本
# title 字符串中所有单词的首字母都大写,其他字母都小写
print('This is a test'.replace('is', 'ezz'))
>> Thezz ezz a test
# replace 将指定子串替换位另一个字符串,并返回替换后的结果,
# 如果指定子串不在,则返回原字符串
# strip: 方法strip 将字符串开头和末尾的空白(也可指定字符)删除,并返回删除后的结果。
table = str.maketrans('cs', 'kz')
print('this is an incredible test'.translate(table))
>> thiz iz an inkredible tezt
# translate 与 replace 类似,但只能进行单字符替换;当替换多个字符时,效率更高
# 判断字符串是否满足特点条件,例如:isspace、isdigit、 issupper