Python 内置数据结构之二(元组)
2019-08-14 本文已影响0人
Alexander_Zz
一、元组 tuple
1.1 一个有序的元素组成的集合
1.2 使用小括号 () 表示
- 示例
t1 = tuple()
t2 = ()
t3 = (1,) # 不可写成 t3 = (1)
t4 = (1,'a',range(1))
1.3 元组是 不可变 对象
- 示例
t5 = (1,[2,3],(4,5))
t5[1] = 3
t5[1][0] = 3
t5[2][0] = 3
不可变示例 1 .png
不可变示例 2 .png
二、元组的定义 初始化
2.1 定义
- tuple() -> empty tuple
- tuple(iterable) -> tuple initialized from iterable's items
- 示例
t = tuple() # 工厂方法
t = ()
t = tuple(range(1,7,2)) # iterable 可迭代对象
t = (2,4,6,3,4,2,)
t = (1,) # 一个元素元组的定义,注意有个逗号
t = (1,)*5
t = (1,2,3) * 5
示例.png
三、元组元素的访问
3.1 支持索引(下标)
- 正索引
a) 从左至右,从 0 开始,为列表中每个元素编号
b) 示例
t1 = (range(5))
t1[2]
示例.png
- 负索引
a) 从右至左,从 -1 开始
b) 示例
t1 = (range(5))
t1[-1]
示例.png
-
正负索引不可超界,否则引发异常 IndexError
IndexError.png
四、元组查询
4.1 index(value,[start,[stop]])
- 通过值 value ,从指定区间查找元组内的元素是否匹配
- 匹配第一个就立即返回索引
- 匹配不到,抛出异常 ValueError
4.2 count(value)
- 返回元组中匹配 value 的次数
4.3 时间复杂度
- index 和 count 方法都是 O(n)
- 随着元组数据规模的增大,而效率下降
4.4 len(tuple)
- 返回元素个数
五、元组的其他操作
5.1 元组是只读的,所以 增、删、改 方法都没有
六、命名元组 namedtuple
6.1 namedtuple(typename,field_names,verbose=False,rename=False)
- 命名元组,返回一个元组的子类,并定义了字段
- field_names 可以是空白符或都好分割的字符串,可以是字段的列表
6.2 示例
from collections import namedtuple
Student = namedtuple('Student','name age') # Student 为返回的类,括号中的 Student 为显示名称
tom = Student('tom',20)
jerry = Student('jerry',21)
示例.png
七、冒泡法
7.1 冒泡法
- 属于交换排序
- 两两比较大小,交换位置。如同水泡咕嘟咕嘟网上冒
- 结果分为升序和降序排列
7.2 升序
- n 个数从左至右,编号从 0 开始到 n-1,索引 0 和 1 的值比较,如果索引 0 大,则交换两者位置,如果索引 1 大,则不交换。继续比较索引 1 和 2 的值,将大值放在右侧。直至 n-2 和 n-1 比较完,第一轮比较完成。第二轮从索引 0 比较到 n-2,因为最右侧 n-1 位置上已经是最大值了。依次类推,没一轮都会减少最右侧的不参与比较,直至剩下最后 2 个数比较
7.3 降序
- 和升序相反
7.4 示例
nums = [1,9,8,5,6,7,4,3,2]
length = len(nums)
for i in range(length -1):
for j in range(length -1 -i):
if nums[j] > nums[j+1]:
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
print (nums)
基础.png
优化.png
7.5 冒泡法总结
- 冒泡法需要数据一轮轮比较
- 可以设定一个标记判断此轮是否有数据交换发生,若无交换发生,则可结束排序,反之进行下一轮排序
- 最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数 1,2,...,n-1 之和 n(n-1)/2
- 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数 n-1
- 时间复杂度 O(n^2)
八、练习
8.1 依次接收用户输入的 3 个数,排序后打印
- 转换 int 后,判断大小排序,使用分支结构完成
- 使用 max 函数
- 使用列表的 sort 方法
# 练习一
nums = []
for i in range(3):
nums.append(int(input('No {} >>>'.format(i)))) # input('>>>')
targets = []
if nums[0] > nums[1]:
if nums[1] > nums[2]:
pass
else: # nums[2] >= nums[1]
if nums[0] > nums[2]:
nums = [nums[0],nums[2],nums[1]]
# targets = [0,2,1] # 记录索引方式,两种方式任选其一
else: # nums[2] >= nums[0]
nums = [nums[2],nums[0],nums[1]]
else: # nums[1] >= nums[0]
if nums[0] > nums[2]:
nums = [nums[1],nums[0],nums[2]]
else: # nums[2] >= nums[0]
if nums[1] > nums[2]:
nums = [nums[1],nums[2],nums[3]]
else: # nums[2] >= nums[1]
nums = [nums[2],nums[1],nums[0]]
print (nums)
# for index in targets: # 索引记录方式打印
# print (nums[index])
练习一.png
# 练习二
# 不推荐实际生产中使用此方法,效率低下
nums = []
for i in range(3):
nums.append(int(input('No {} >>>'.format(i))))
targets = []
# while nums: # 不推荐使用 for 循环,for j in range(len(nums)):
# targets.append(max(nums))
# nums.remove(max(nums))
# print (targets)
while True:
val = max(nums)
print (val)
nums.remove(val)
if len(nums) == 1:
print (nums[0])
break
练习二.png
# 练习三
nums = []
for i in range(3):
nums.append(int(input('No {} >>>'.format(i))))
nums.sort() # 如需倒序,nums.sort(reverse=True)
print (nums)
练习三.png