<Python> python从入门到实践(2) --组合数据类型
组合数据类型
序列
序列是具有先后关系的一组元素,具有以下特点:
- 是一个一维向量,
- 元素类型可以不同,
- 元素间由序号引导,通过下标可以访问特定元素,且具有正向递增(从头从0)下标和反向递减(从尾从-1)。
- 序列是一个基类类型,在其上由继承出字符串、元组、列表。
- 序列类型通用操作符:
| 操作符及应用 | 描述 |
|---|---|
| x in s | 如果x是序列的元素,返回True,否则返回False |
| x not in s | 如果x是序列的元素,返回False,否则返回True |
| s + t | 连接两个序列s和t |
| s*n 或 n*s | 将序列s复制n次 |
| s[i] | 索引,返回s中第i个元素,i是序列的序号 |
| s[i:j]或s[i:j:k] | 切片,返回序列s中i到j以k为步长的元素子序列 |
- 序列类型通用函数和方法
| 函数或方法 | 描述 |
|---|---|
| len(s) | 返回序列s的长度,即元素个数 |
| min(s) | 返回序列s的最小元素,s中元素需要可比较 |
| max(s) | 返回序列s的最大元素,s中元素需要可比较 |
| s.index(x)或s.index(x,i,j) | 返回序列s从i开始到j位置中第一次出现元素x的位置 |
| s.count(x) | 返回序列s中出现x的总次数 |
之前提过,元组、列表、字符串都是序列,所以上述操作都是通用的
列表简介
列表是什么
列表是一系列按特定顺序 排列的元素组成,其中的元素可以没有任何关系
# 用方括号创建列表
table = ['num1', 'num2', 'num3']
# 用list()创建,list可以将其他复杂类型转换为列表
table = list('num1', 'num2', 'num3')
# 打印列表
print(table)
# 将会得到输出
# ['num1', 'num2', 'num3']
-
访问列表元素
print(table[0])将会输出 ‘num1’以上例子也能显示,索引是从0开始的,再次强调,索引-1表示最后一个元素,-2表示倒数第二个,以此类推
-
修改、增删元素
- 修改时通过特定索引访问,然后修改即可
- 添加时,使用作用于列表的方法append(元素)的方式在尾部增加元素
- 插入时,使用作用于列表的方法insert(索引,元素)的方式在指定位置处增加元素(其余元素后移)
- 删除时,使用del语句删除元素,或使用作用于列表的方法pop()方法来删除并获取尾部的元素,也可以用作用于列表的方法pop(索引)方法来删除并获取指定索引的元素
- 根据值删除元素,可以使用作用于列表的方法remove(值)的方式删除所有值为给定的元素
# 综合应用 # 创建列表 names = ['Gao Yuhe', 'Gao min', 'Er gou'] # 遍历并输出 for name in names: print(name.title()+", would you like to have dinner with me?") print(names[-1].title() + " could not come, Let's invite sjm") # 删除元素 del names[-1] # 尾部增加元素 names.append("sjm") for name in names: print(name.title()+", would you like to have dinner with me?") print("Let's invite some others") # 指定位置插入元素 names.insert(0, "zhao siqi") names.insert(0, "yu yihuan") for name in names: print(name.title()+", would you like to have dinner with me?") print("Something's wrong, we can only invite two guests") # 弹出元素 while len(names) > 2: print(names.pop() + ", sorry ,there won't be your seat") for name in names: print(name.title()+", would you like to have dinner with me?") # 字符串化 print("Finally, there are "+str(len(names))+" come to the dinner.") # 排序与反转 names.sort() for name in names: print("\tThey are " + name.title()) names.sort(reverse=True) for name in names: print("\tThey are " + name.title()) names.reverse() for name in names: print("\tThey are " + name.title()) del names[0] del names[0] for name in names: print(name.title()+", would you like to have dinner with me?") -
组织列表
- 使用作用于列表的方法sort() 实现对列表自动排序(如字符串的字母序、数从小到大),值得注意的是,这个排序将会永久改变列表内元素的顺序
- 使用方法sort(reverse=True) 将会按与自动排序相反的顺序排序
- 使用函数sorted(列表)实现对列表的临时排序,同样可以加上参数reverse=True 实现与自动排序相反的排序
- 更多的排序函数将会在后续补充
- 反转列表,可以使用方法reverse() ,将列表反转
- 可以使用函数 函数len(列表) 获取列表的长度
-
避免索引错误:记住从0开始有元素,另外-1表示最后一个
操作列表(遍历循环)
-
遍历列表
for <变量名> in <列表变量名>实现全部遍历,类似于foreach# 例子 for name in names: print(name.title()+", would you like to have dinner with me?") -
避免缩进错误:
- 错误1: 循环体忘记缩进
- 错误2: 循环体较长时只缩进了一部分
- 错误3: 不必要的缩进,比如顺序结构下的缩进、缩进了循环体结束后的语句
- 错误4:忘记冒号, 与C_like语言不同,python在if与循环判断语句时不惯用()而是使用:
-
创建数值列表
-
函数range(起,止) 可以生成一系列数字
for value in range(1,5) print(value) # 输出 # 1 # 2 # 3 # 4注意左闭右开
-
使用range()创建数字列表,如果将range()作为函数list()的参数,将会产生一个数字列表
numbers = list(range(1,6)) print(numbers) # output: # [1,2,3,4,5]numbers成为一个列表
-
为range函数指定步长: 使用函数range(起,止,步长)
even_numbers = list( range(2,11,2)) print (even_numbers) # output: # [2,4,6,8,10]同样为左闭右开区间
-
自定义数字列表
squares = [] for value in range(1,11): square=value**2 squares.append(square) print(squares)这里的
for value in range(1,11)就相当于其它语言的for(int i=1;i<11;i++)
-
-
对数字列表执行简单的统计计算
-
函数min(列表变量) :获取数字列表中最小值
-
函数max(列表变量) :获取数字列表中最大
值
-
函数sum(列表变量) :获取数字列表所有值的总和
-
-
列表解析:
将for循环和创建新元素的代码合并成一行,并自动附加新元素
squares = [value ** 2 for value in range(1,11)] # output: # [1,4,9,16,25,36,49,64,81,100] -
使用列表的一部分(切片)
-
切片:<列表变量>[起始索引:终止索引]
players = ['A','B','C','D'] print(players[0:2]) # output: # ['A','B']同样是左闭右开,如果缺少起始索引,将会从0开始,缺少终止索引,将会一直到最后,[::-1]的切片是整个原序列的逆序
-
遍历切片
for player in players[0:2] print(player) -
复制列表
- 要复制列表,可以创建一个包含整个列表的切片,方式是同时省略起始索引和终止索引(也就是创建一个从0到-1的切片),随后将这个切片赋值给新列表即可
- 如果直接进行列表间的赋值,就类似于C语言的指针赋值一样,操作其中一个列表,另一个也会变化,事实上没有得到两个列表
-
-
元组
列表内元素是可修改的,适合用于存储运行期间可能变化的数据集,而有时需要不可修改的元素,存放一系列不可修改元素的被称为元组
-
定义元组和基本用法:
# 用小括号定义元组 dimensions = (200,50) #用tuple()定义元组,tuple()可以将其他复杂元素变为元组, #有利于利用元组的不可修改元素的特性保护数据 dimensions = tuple(200, 50) # 输出元素,将会输出200 print(dimensions[0]) # 尝试修改元素,会报错 dimensions[0]=999 # 报错 # 遍历元组 for dimension in demensions: print(dimension) -
虽然无法修改元组内的元素,但是可以修改元组变量
dimensions = (200,50) for dimension in demensions: print(dimension) dimensions = (999,99) # 允许 for dimension in demensions: print(dimension)
-
字典
- 字典是对“映射”的一种建模,而映射是索引(键)和数据(值)的对应,像之前列表中的下标和值也是一种映射,字典的映射建立更加自由灵活
示例:
# 简略的初始化,适合较短的字典
alien={'color':'green','points':5}
# 复杂的初始化,适合较长的字典,注意缩进
pals={
'Alan':'Helen'
'Bob':'Cindy'
'Cindy':'Bob'
'Helen':'Alan'
}
print(alien['color'])
print(alien['points'])
-
基础:
- 字典是一系列键-值对,与键相关的值可以是数字、字符串、列表、甚至字典
- 访问字典中的值
<字典名>[键] - 添加或修改键-值对:字典是一种动态结构,可以随时添加键-值对,要添加键-值对,可依次使用
<字典名>[<键名>]=值 - 删除键-值对:
del <字典名>[键] - <字典名>.keys()返回字典d中所有的键信息
- <字典名>.values()返回字典d中所有的值信息
- <字典名>.items()返回字典d中所有的键值对信息,返回的是特殊的dict_values类型,便于直接使用for-in结构
-
遍历字典
#使用items()方法遍历整个字典的键值对 friends = {'first' : 'Gao Yue' 'Second' : 'Yu Yihuan' 'Third' : 'Zhao Dadiao' } for key, value in friends: print(key + ': ' + value + '.') #key & value分别用于遍历键和值,这两个变量名字任意 #分别使用字典的keys()和values()方法来遍历所有键,由于使用一个变量遍历字典默认遍历键名,所以事实上.keys()方法大部分情况下可以省略 friends = {'first' : 'Gao Yue' 'Second' : 'Yu Yihuan' 'Third' : 'Zhao Dadiao' } for key in friends.keys(): print(key + '.') for value in friends.values(): print(value + '.') #通常遍历字典的顺序时随机的,为了使按某种顺序遍历,可以对字典使用sorted()函数,不含参数时,字典序遍历 friends = {'first' : 'Gao Yue' 'Second' : 'Yu Yihuan' 'Third' : 'Zhao Dadiao' } for key in sorted(friends.keys()): print(key + '.') #利用set()将字典、列表转换为set实现去重 friends = {'first' : 'Gao Yue' 'Second' : 'Yu Yihuan' 'Third' : 'Zhao Dadiao' } for key in set(friends.keys()): print(key + '.') -
字典允许嵌套,可以创建字典列表,列表字典,字典字典
# 字典嵌套字典示例 users = { 'Alan': { 'first': 'Alan' 'last': 'Adoil' 'location': 'Atlantic' } 'Brown': { 'first': 'Brown' 'last': 'Black' 'location': 'Beijing' } }
| 函数或方法 | 描述 |
|---|---|
| d.get(k,<default> ) | 键k存在,则返回相应值,不在则返回<default>值 |
| d.pop(k, <default>) | 键k存在,则取出相应值,不在则返回<default>值 |
| d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
| d.clear() | 删除所有的键值对 |
| len(d) | 返回字典d中元素的个数 |

浙公网安备 33010602011771号