注:该学习笔记是根据曾志贤老师编写的《从Excel到Python,用Python轻松处理Excel数据》所学习整理的笔记。
第六章 元组类型处理技术
Python中元组与列表类似,同属序列类型,都可以按照特定顺序存放一组数据,数据类型不受限制,切片方式相同。
区别在于元组存储的数据不能被修改,比如不能对元组的元素进行添加、删除。可以将元组看作是只读属性的列表。
元组的优势是占用内存小,存取速度快。
一、元组的创建与删除
元组用小括号(())表示,元组里的元素用逗号分隔。
tup1=()
print(type(tup1)) #返回 <class 'tuple'>
tup2=tuple()
print(tup2) #返回 ()
tup3=(1,2,3)
print(tup3) #返回 (1,2,3)
tup4=(100,)
print(tup4) #返回 (100,)
del tup3
print(tup3) #返回 错误(因为tup3已被删除)
二、元组的基本操作
元组虽然没有列表灵活,但一些基本的操作还是可以实现的,比如切片、合并、循环、推导、转换等。
1、元组的合并
tup=(1,2,3)
print(id(tup),tup) #返回tup的内存地址 与元组
tup +=(4,5,6)
print(id(tup),tup) #返回tup的内存地址 与元组
#合并元组后,tup内存地址不相同,代表组合后的tup并非组合前的tup,而是新产生的tup
2、元组的复制
元组也可以分为浅复制与深复制,只不过浅复制只能使用copy模块中的浅复制,而列表的浅复制可以直接使用copy函数。
当元组中有不可变类型的对象时,执行深复制和浅复制都不会再开辟内存空间,而是用的同一个内存地址;当元组中有可变类型的对象时,执行深复制会重新开辟一个内存空间。
import copy
tup1=(1,2,3) #不可变对象
print(id(tup1),tup1)
tup11=(1,[2],3) #包含可变对象
print(id(tup11),tup11)
#浅复制 不论复制可变对象还是不可变对象,都不会改变id
tup2=copy.copy(tup1)
print(id(tup2),tup2) #返回的id与tup1的id相同
tup22=copy.copy(tup11)
print(id(tup22),tup22) #返回的id与tup11的id相同
#深复制 不可变对象,id不会改变
tup3=copy.deepcopy(tup1)
print(id(tup3),tup3) #返回的id与tup1的id相同
tup33=copy.deepcopy(tup11)
print(id(tup33),tup33) #返回的id与tup11的id不相同
3、元组的循环
元组可以像列表一样做元组推导式和for循环,在返回一个新元组。
元组推导式的结果不是元组,而是生成器,生成器也是可迭代对象。生成器可使用tuple类对象将其转换为元组。当然也可以转换为其他类对象,例如list类对象。
tup=(1,2,3)
#推导式方式的写法
tup1=(t*10 for t in tup)
print(tup1)
#返回 <generator object <genexpr> at 0x000001AEF5B244A0> 生成器,也是迭代对象
print(tuple(tup1)) #将生成器转换为元组
#循环方式的写法
tup2=()
for t in tup:
tup2 +=(t*10,) #进行累积组合,必须要将循环的元素也加上(),才能表面是元组。
print(tup2)
4、元组的转换
在Python中,可以使用tuple类对象创建或转换一个元组对象,以及可以将其他可迭代对象转换为元组。
语法结构:
tuple([iterable])
参数说明:
- iterable:可选参数,要转换为元组的可迭代序列。
print(tuple('123')) #将字符串转换为元组
print(tuple([1,2,3])) #将列表转换为元组
print(tuple({1,2,3})) #将集合转换为元组
print(tuple({'a':1,'b':2,'c':3})) #将字典中的键转换为元组
print(tuple(zip([1,2],[10,20]))) #将可迭代对象转换为元组
print(tuple(range(1,10))) #将可迭代对象转换为元组
案例一、将单列数据转换为多行多列数据
在“名单”工作簿中的“名单表”工作表中按照用户指定的列数进行转换。
转换前
转换后
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('名单.xls')
ws=wb.sheet_by_name('名单表')
nwb=copy(wb)
nws=nwb.add_sheet('处理后')
col_vals=ws.col_values(0)
col_count=int(input('请输入每行存放的数量:'))
lst=[]
if ws.nrows%col_count==0: #这段if判断生成最大行数
row_count=ws.nrows//col_count
else:
row_count=ws.nrows//col_count+1
col_num=tuple(range(0,col_count))*row_count #将最大行数拆分
for r in range(0,row_count): #这段for循环生成将要输出值所需要放在的行号
for v in (r,)*col_count:
lst.append(v)
row_num=tuple(lst) #将它转换为元组类型
num=tuple(range(1,ws.nrows+1)) #生成序号
for i,j,k,l in zip(row_num,col_num,num,col_vals): #将行、列、序号、值从组放入对应的单元格位置
nws.write(i,j,'{}:{}'.format(k,l))
nwb.save('名单-1.xls')
5、元组常用统计函数
tup=(50,60,74,63,50,95,74,80,50)
print(len(tup)) #计数
print(max(tup)) #最大值
print(min(tup)) #最小值
print(sum(tup)) #求和
print('{:.2f}'.format(sum(tup)/len(tup))) #平均数
print(tup.count(50)) #条件计数
print(tup.index(80)) #条件定位