因为注释都非常清晰了,所以文字部分不赘述,大家可以先看运行结果截图感受一下这个类以及里面的方法大概是如何工作的。名字全都起得可读性非常高!
然后上代码!
"""
需要定义类:My2Dlist
__init__需要的参数有self,size(默认None,类型为元组),
defaultValue(默认是0,类型为int,float,一维或者二维列表)
它有两个私有变量:self.__size(一个列表)和self.__items(二维列表的本体)
它分三种情况判断defaultValue,并在可行情况下填好self.items
1. 未指定size,且defaultValue不是二维列表
2. 未指定size,但defaultValue是二维列表
3. 指定了size,可以据此创建二维列表
(1)defaultValue是int或者float,那么整个列表都在重复这个数
(2)defaultValue是一维列表,那么只要元素个数对的上,就reshape成二维
其余形式的defaultValue都是不合法输入
合法输入的形式有:size=None, defaultValue=[[...],[...],...]
size=(3,4), defaultValue=2
size=(3,4), defaultValue=[...](要有12个数)
类中的方法有is2Dlist,get2Dlist,Size,Index,AppendRow,AppendCol,DeleteRow,DeleteCol
is2Dlist 需要参数self和data,data对应defaultValue,返回Ture或False,用于判断它是不是二维列表
get2Dlist 需要参数self,返回self.__items,用于创建二维列表
Size 需要参数self,返回self.__size,用于得到二维列表大小
Index 需要参数self,rowIndex,colIndex,返回列表中对应的行/列/值
AppendRow 需要参数self,rowData,用于向列表最后加上一行
AppendCol 需要参数self,colData,用于向列表最后加上一列
DeleteRow 需要参数self,rowIndex,用于删除对应行
DeleteCol 需要参数self,colIndex,用于删除对应列
"""
class My2Dlist(object):
def __init__(self, size=None, defaultValue=0):
# 如果没有指定大小,defaultValue也不是二维列表
if size is None and not self.is2Dlist(defaultValue):
print('如果不指定大小,请输入一个二维列表!')
# 如果没有指定大小,但是defaultValue传入了一个二维列表
elif size is None and self.is2Dlist(defaultValue):
self.__items = defaultValue
self.__size = (len(defaultValue), len(defaultValue[0]))
else: # 指定大小了。此时考虑是数字(int,float)、是一维列表,其余均为不合法输入
self.__size = list(size)
# 需要转换成list是因为后面增删行列会需要修改size
if isinstance(defaultValue, int) or isinstance(defaultValue, float):
self.__items = []
for i in range(self.__size[0]):
rowItems = [] # 在外层循环,临时变量,存好一行的值以后马上存入self.__items
for j in range(self.__size[1]):
rowItems.append(defaultValue)
self.__items.append(rowItems)
# defaultValue是一维列表,且元素个数和size规定的个数相等
elif isinstance(defaultValue, list) and len(defaultValue) == self.__size[0] * self.__size[1]:
self.__items = []
for i in range(self.__size[0]):
rowItems = []
for j in range(self.__size[1]):
rowItems.append(defaultValue[i * self.__size[1] + j])
self.__items.append(rowItems)
else:
print('请输入合法数据!')
def is2Dlist(self, data):
# 如果data不是list,或者data[0]不是list(data不是二维列表)
if not isinstance(data, list) or not isinstance(data[0], list):
return False
else: # 筛选出来的满足data是二维列表,现在检查元素是不是int float
for row in data:
# 如果有row不是list,或者有row和第一行的长度不一样
if not isinstance(row, list) or len(row) != len(data[0]):
return False
else:
for i in range(len(row)):
# 逐行检查,每行用i遍历每个元素,看是否int float
if not isinstance(row[i], int) and not isinstance(row[i], float):
return False
return True # 满足了以上所有排除的情况,就可以返回True
def get2Dlist(self):
return self.__items
def Size(self):
return self.__size
def Index(self, rowIndex=None, colIndex=None):
if rowIndex is None and colIndex is None:
print('请输入数据!')
elif isinstance(rowIndex, int) and colIndex is None:
# 只给定了行指标,则返回这一行
if 0 <= rowIndex < self.__size[0]:
return self.__items[rowIndex]
else:
print('指标越界!')
elif isinstance(colIndex, int) and rowIndex is None:
# 只给定了列指标,则返回这一列
if 0 <= colIndex < self.__size[1]:
colItems = []
for row in self.__items:
colItems.append(row[colIndex])
return colItems
else:
print('指标越界!')
elif isinstance(rowIndex, int) and isinstance(colIndex, int):
if 0 <= rowIndex < self.__size[0] and 0 <= colIndex < self.__size[1]:
return self.__items[rowIndex][colIndex]
else:
print('指标越界!')
else:
print('请输入整数作为指标!')
def AppendRow(self, rowData):
# 需要检查rowData长度是不是和列表的行长度size[1]一致
if len(rowData) == self.__size[1]:
self.__size[0] += 1 # 加了一行,所以修改size
self.__items.append(rowData)
else:
print('请输入和原列表长度相同的一行!')
def AppendCol(self, colData):
# 需要检查colData长度是不是和列表的行长度size[0]一致
if len(colData) == self.__size[0]:
self.__size[1] += 1
for i in self.__size[0]:
self.__items[i].append(colData[i])
else:
print('请输入和原列表长度相同的一列!')
def DeleteRow(self, index):
if 0 <= index < self.__size[0]:
newItems = []
for i in range(self.__size[0]):
if i != index:
# 不是要删除的那一行,全都加入newItem里面
newItems.append(self.__items[i])
self.__size[0] -= 1
self.__items = newItems
else:
print('指标越界!')
def DeleteCol(self, index):
if 0 <= index < self.__size[1]:
newItems = []
for i in range(self.__size[0]):
rowItems = []
for j in range(self.__size[1]):
if j != index:
rowItems.append(self.__items[i][j])
newItems.append(rowItems)
self.__size[1] -= 1
self.__items = newItems
else:
print('指标越界!')
# 下面用一些例子来测试一下
ls0 = My2Dlist()
ls1 = My2Dlist(size=(2, 3), defaultValue=1)
print(ls1.get2Dlist())
ls2 = My2Dlist(size=(3, 3), defaultValue=[1, 2, 3, 4, 5, 6])
ls3 = My2Dlist(size=(2, 3), defaultValue=[1, 2, 3, 4, 5, 6])
print(ls3.get2Dlist())
ls4 = My2Dlist(size=None, defaultValue=[[1, 2], [3, 4], [5, 6]])
print(ls4.get2Dlist())
print(ls4.Size())
print(ls4.Index(2, 5)) # 虽然提醒了指标越界,还是会出结果None
print(ls4.Index(0, 1))
print(ls3.Index(None, 1))
ls1.AppendRow([2, 3, 4])
print(ls1.get2Dlist())
ls3.DeleteCol(1)
print(ls3.get2Dlist())
?希望看到这篇的都可以看懂,毕竟我的风格就是注释详细,虽然内容都不难,重在细节~
|