用元组为键的简易表格

以前一直以为字典的键必须为字符串值,所以之前都要把其他值转换成字符串,再去存储。后来再看帮助的过程中偶然发现还可以用其他类型作为键,

好像说是除了不能用可变类型的值都是可以的。

最近要处理一些表格数据,比如日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



评论
©appall | Powered by LOFTER