用元组为键的简易表格
以前一直以为字典的键必须为字符串值,所以之前都要把其他值转换成字符串,再去存储。后来再看帮助的过程中偶然发现还可以用其他类型作为键,
好像说是除了不能用可变类型的值都是可以的。
最近要处理一些表格数据,比如日k数据等,如果做一个简易表格类处理这些数据,那是非常方便。
这次就用元组做键定位字典内的值,比用拼接字符串方便多了。
#jytb.py
classtab2class(): # 用元组为键基于零开始的简易表格
def__init__(self):
self.nrow,self.ncol = 1,1# 初始一个最小表格
self.zdcell={}
defclear(self):
self.zdcell.clear()
defnewtb(self,nrow,ncol):
if nrow>0and ncol>0:
self.nrow,self.ncol = nrow,ncol
defgetcell(self,irow,jcol): # 表格行列计数从0开始
if0<=irow<self.nrow and0<=jcol<self.ncol:
pass
else:
returnNone
try:
val = self.zdcell[(irow,jcol)]
exceptKeyError:
returnNone
return val
defsetcell(self,irow,jcol,val): # 表格行列计数从0开始
if0<=irow<self.nrow and0<=jcol<self.ncol:
pass
else:
return
try:
self.zdcell[(irow,jcol)] = val
exceptKeyError:
return
defsetrect(self,irow1,jcol1,irow2,jcol2,val): # 按对角矩形设置值,小值在前
if0<=irow1<=irow2<self.nrow and0<=jcol1<=jcol2<self.ncol:
pass
else:
return
for i inrange(irow1,irow2+1):
for j inrange(jcol1,jcol2+1):
self.setcell(i,j,val)
defsetall(self, val):
for i inrange(self.nrow):
for j inrange(self.ncol):
self.setcell(i,j,val)
defshowall(self):
for i inrange(self.nrow):
for j inrange(self.ncol):
val = self.getcell(i,j)
print(val, end='\t')
print()
################################################################################
deftab2test():
s="""
210204 2.91 2.76 2.92 2.72 623358
210205 2.77 2.72 2.95 2.68 474517
210208 2.73 2.65 2.75 2.62 313065
210209 2.71 2.84 2.89 2.65 501641
210210 2.87 2.81 2.94 2.77 372646
210218 2.87 2.93 2.98 2.86 436173
210219 2.93 3.04 3.06 2.90 455948
210222 3.05 3.08 3.22 3.05 621023
210223 3.06 2.94 3.10 2.92 491709
210224 2.98 3.13 3.24 2.97 769814
210225 3.14 3.07 3.15 3.02 449588
"""
ss=s.strip().split('\n')
nrow = len(ss)
ncol = 0
if nrow >=1:
xx=ss[0].split()
ncol=len(xx)
if ncol < 1: return
print(nrow,ncol)
tb=tab2class()
tb.newtb(nrow,ncol)
tb.setall('yy')
tb.setrect(0,0,5,0,'yymmdd')
tb.setrect(0,1,5,5,0.0)
tb.showall()
for i,v inenumerate(ss):
xx=v.split()
tb.setcell(i,0,xx[0])
tb.setcell(i,1,float(xx[1]))
tb.setcell(i,2,float(xx[2]))
tb.setcell(i,3,float(xx[3]))
tb.setcell(i,4,float(xx[4]))
tb.setcell(i,5,float(xx[5]))
tb.showall()
测试如下:
>>> tab2test()
11 6
yymmdd 0.0 0.0 0.0 0.0 0.0
yymmdd 0.0 0.0 0.0 0.0 0.0
yymmdd 0.0 0.0 0.0 0.0 0.0
yymmdd 0.0 0.0 0.0 0.0 0.0
yymmdd 0.0 0.0 0.0 0.0 0.0
yymmdd 0.0 0.0 0.0 0.0 0.0
yy yy yy yy yy yy
yy yy yy yy yy yy
yy yy yy yy yy yy
yy yy yy yy yy yy
yy yy yy yy yy yy
210204 2.91 2.76 2.92 2.72 623358.0
210205 2.77 2.72 2.95 2.68 474517.0
210208 2.73 2.65 2.75 2.62 313065.0
210209 2.71 2.84 2.89 2.65 501641.0
210210 2.87 2.81 2.94 2.77 372646.0
210218 2.87 2.93 2.98 2.86 436173.0
210219 2.93 3.04 3.06 2.9 455948.0
210222 3.05 3.08 3.22 3.05 621023.0
210223 3.06 2.94 3.1 2.92 491709.0
210224 2.98 3.13 3.24 2.97 769814.0
210225 3.14 3.07 3.15 3.02 449588.0