5. 结构化数据和序列
Python拥有丰富的结构化的数据类型,这是Python语言的优势所在,掌握这些数据类型,也是学习Python最主要的任务。所谓“结构化数据”,就是把一组数据或对象,用一定的方式组合起来,可以更好地表达真实事物,可以更便捷地处理数据。
5.1 元组Tuple
5.1.1 元组的特征
元组Tuple是一组Python对象序列,三个特征:一维、定长、不可变。
元组内的元素可以是各种Python对象,可以是不同的数据类型。
元组常用于固定的数据组合,例如:12个星座的名称:('水瓶座','双鱼座'...)。
创建元组对象,最简单的方法就是一组用逗号隔开的数据,用圆括号包括起来(在不产生歧义的情况下,也可以不用括号)。
tup1 = 1, 2, 3
tup1
tup1 = 1, 2, (3, 4)
tup1
用tuple()函数可以把大部分Python对象转为元组
tuple([4, 0, 2])
tup2 = tuple('string')
tup2
读取元组的元素,方法与数组类似,就是用“方括号+序号”来读取。与Java等语言类似,Python的序列都是从0开始的
tup2[0]
元组的不变性,体现在元组创建后,不能再对已有的元素重新赋值,但已有的元素本身是可变的。
tup3 = 'abc', [1, 2], 59
tup3
tup3[2] = 60
tup3[1].append(3)
tup3
5.1.2 元组合并
用+加号连接几个不同的元组
tup1 + tup2 + tup3
元组乘以一个整数,相当于连接了几个副本。
tup1 * 4
5.1.3 元组的长度
元组的长度就是元组中元素的个数。某个元素即使拥有很多子元素,也只能算一个元素。
tup = (1, 2, (3, 4), 'abc')
len(tup)
5.1.4 统计元组中某个数值的个数
a = (1, 2, 2, 2, 3, (4, 2))
a.count(2)
5.2 列表 List
5.2.1 列表的特征
列表List的组成方式与元组一样,但它的长度可变,内容也可以修改。
创建列表的方法,是用方括号包括一组用逗号隔开的元素。如下:
lst1 = [2, 3.14, True, 'abc', None]
lst1
对已有的某个元素重新赋值。
lst1[1]='x'
lst1
5.2.2 列表增加和删除元素
在列表后面追加元素
lst1.append('end')
lst1
在某个中间位置插入元素
lst1.insert(2, 'word')
lst1
按位置标号删除元素。pop与insert互为逆运算
lst1.pop(2)
lst1
按元素的值删除元素。
思考:如果列表中,有多个值相同的元素,这时用remove方法按值删除,会得到什么结果?
lst1.remove('abc')
lst1
用 in 判断列表中是否包含某数据
'end' in lst1
5.2.3 列表合并
用 + 加号可以合并,形成一个新的列表,原列表的值不变。
lst1 + [7, 8, (2, 3)]
用extend()方法,在原列表后追加多个元素。
lst1.extend([7, 8, (2, 3)])
lst1
5.2.4 列表的长度
与元组一样,列表的长度就是列表中元素的个数。
注意:如果列表中某个元素也是列表或其他结构化数据,在计算整个列表的长度时,这个列表元素也只能贡献一个长度。
len(lst1)
5.2.5 排序
如果一个列表中都是数值(整数或浮点数)元素,或都是字符串元素时,可以用自带的sort()方法,对其元素进行排序。调用sort()方法排序不生成新的对象,而是取代了旧的对象。所以,如果要保留排序前的列表,可以先把列表赋值给另一个变量名后再排序。
默认情况下,sort()方法是按由小到大的顺序排序。
lst2 = [7, 2, 5, 1, 3]
lst2.sort()
lst2
如果想要由大到小排序,可以指定参数 revers=True
lst2.sort(reverse=True)
lst2
通过设置sort函数的参数,可以按特定的函数值排序。例如对一组字符串按长度进行排序:
lst3 = ['saw', 'small', 'He', 'foxes', 'six']
lst3.sort(key=len)
lst3
5.2.6 切片
切片(Slice),是指通过序号选取序列类型(数组、列表、元组等)的子集。
切片基本形式是: [ 起始序号 : 结束序号 ]
实际选中的元素序号为:起始序号、起始序号+1、...、结束序号-1
也就是说,起始序号元素是被选中的,而结束序号的元素没有被选中。
注意:Python的序列类型,元素序号都是从0开始的。
lst4 = [0, 1, 2, 3, 4, 5, 6, 7]
lst4[1:5]
切片时,起始序号空缺表示从0开始,结束序号空缺时,表示直到序列结尾处。
lst4[:5]
lst4[3:]
“起始序号”和“结束序号”也可以为负数,负数表示从结尾开始切片。“-i”表示从结尾往前数第i个元素(这里从1开始数),其作用效果等价于“序列长度 - i”。
len(lst4)
lst4[-2:]
lst4[ len(lst4)-2 : ]
lst4[-6 : -2]
lst4[len(lst4)-6 : len(lst4)-2]
还可以在切片时,再用一个冒号和数字,表示取元素的步长,比如每隔一位取一个元素:
lst4[::2]
步长取负数,表示从切片的结尾处开始,按步长取元素。比如步长用-1,可以实现逆序
lst4[::-1]
5.3 字典
字典(dict)是Python重要的数据结构之一。字典的特征:
字典的元素是一个“key : value”(键 : 值)的组合。其中键和值可以是Python的各种对象。 创建字典用大括号{}把元素包含在内,元素间用逗号隔开,每个元素的key和value之间用冒号隔开。 字典的长度、内容都是是可变的 与列表不同,访问字典内元素的方法,不是用序号,而是用key 字典的键必须是“不可变”对象,比如:标量、字符串、元组等dct1 = {'a' : 'hello', 'b' : [1, 2, 3, 4]}
dct1
dct1[0] = 'bye' #这里不是表示第0个元素,而是键值为0
dct1
dct1['a'] = 'hi'
dct1
用 in 关键字判断字典中是否包含某个key
'b' in dct1
0 in dct1
5.3.1 删除和添加元素
用del关键字或pop()方法删除字典的元素,它们的区别是,pop()方法除了删除元素之外,还返回了被删除的值。
dct1[5] = 'some value'
dct1['one'] = '某个数值'
dct1
del dct1[5]
ret = dct1.pop('one')
ret
dct1
用update()方法对字典增加新元素,或修改原有键的值
dct1.update({'b' : 'new value', 'c' : 12})
dct1
5.3.2 获取所有键或值
用字典自带的keys()和values()方法,可以分别获得字典的所有键和值。需要注意的是,这里获取的键和值都是数据集合,一般要再用一个for循环结构才能获得某个键和值。
dct1.keys()
dct1.values()
for v in dct1.values():
print(v)
5.3.3 从列表创建字典
将两个列表中的元素两两配对地组成一个字典,一个列表的元素成为字典的key,另一个列表的元素成为value。
这里可以使用Python内置的zip()函数。
lst1 = [0, 1, 2, 3]
lst2 = ['one', 'two', 'three']
dct2 = dict(zip(lst1, lst2))
dct2
5.4 集合Set
集合Set与数学中的集合概念一样,由一组不重复的对象组成。可以看作没有值只有键的字典。集合的特征:
集合内的元素可以是各种Python对象,但不能重复 集合内的元素是无序的,不能像list那样用序号访问元素,也不能切片操作创建一个集合,可以用set()函数,或用大括号把元素包括起来即可。
set1 = {'hello', 1, 4.1}
set1
以下例子中可以看出集合元素的唯一性特点
set2 = set([2, 2, 2, 1, 3, 3])
set2
集合增加或删除元素。如果把一批对象加进集合中,实际上集合只会吸收那些新的对象,其他重复的对象被忽略掉。
set1.add('abc')
set1
set1.add('hello')
set1
set1.remove('abc')
set1
集合之间可以进行交、并、差等运算,与我们在数学中的集合概念完全一样。
set1 | set2 # 并集
set1 & set2 # 交集
set1 - set2 # 差
set1 ^ set2 # 异或(对称差)
判断两个集合之间是否子集或超集
set3 = {1, 2}
set3.issubset(set2)
set2.issuperset(set3)
集合的无序性
{1, 2, 3} == {3, 2, 1}
5.5 元组、列表、字典、集合的遍历
对于本章所学习的元组、列表、字典和集合这几个结构化数据来说,遍历是最常用的操作,而且它们的遍历方法基本一致,就是用for循环实现。
元组的遍历
for element in tup1:
print(element)
for element in lst1:
print(element)
for element in dct1:
print(element)
for element in dct1.values():
print(element)
for element in set1:
print(element)