IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python面向对象创建并修改二维列表 -> 正文阅读

[Python知识库]Python面向对象创建并修改二维列表

因为注释都非常清晰了,所以文字部分不赘述,大家可以先看运行结果截图感受一下这个类以及里面的方法大概是如何工作的。名字全都起得可读性非常高!

然后上代码!

"""
需要定义类: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())

?希望看到这篇的都可以看懂,毕竟我的风格就是注释详细,虽然内容都不难,重在细节~

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:06:36  更:2022-04-04 12:07:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:04:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码