在python中,为了实现锯齿数组的数据结构,经常需要初始化一个行数指定、列数可以每行不同的list(np.array是定长的,无法实现锯齿数组变长的需求)。
我们首先来回顾一下一维list的初始化。python初始化指定长度的一维list有两种等价的方式
方式一
a = [None] * n
方法二
a = [None for i in range(n)]
结果都能得到 (n = 5)
[None, None, None, None, None]
事实上,在一维情形下,由于初始化list时被复制的元素是None,因此两种方式是等价的。
但是二维情形就不一样了,因为初始化指定长度的二维list时,我们需要把空序列list()复制n次。如果采用方式一,则对list进行浅拷贝,每一个list调用append等方法时,所有list都会同步调用;而方式二这种python风格的数组comprehension表达式方式,则生成了n个相互独立的list对象,此时每行的list之间互不影响。显然,我们应该使用方式二来进行二维list的指定行数的初始化。
测试如下:
方式一
a = [list()] * 5
a[0].append(1)
结果一
[[1], [1], [1], [1], [1]]
方式二
a = [list() for i in range(5)]
a[0].append(1)
结果二
[[1], [], [], [], []]
以上内容来自百度——一枚诚实的搬运工
=====================================
这里是我想实现的存储结构,通过访问灰度图像中像素点的位置(x,y)即二维数组的两个下标来访问该像素点的灰度值,边缘标记等信息。
即二维列表(数组)里的元素依然是列表
#假设是5行3列的二维数组,即图片大小为5*3
a = [list() for i in range(5)]
for f in range(len(a)):
a[f].extend([list() for e in range(3)])#这里用extend才能把迭代的结果追加到a[f]中,有没有中括号都可以。
print(a)
a[1][0].append(255)
a[1][0].append(0)
print(a,'\n',a[1][0][0])#访问第二行第一列的列表中的第一个元素
运行结果:
[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]]
[[[], [], []], [[255, 0], [], []], [[], [], []], [[], [], []], [[], [], []]]
255
顺便补充一下extend和append:
上文中有中括号可能好理解一些
extend :一个列表追加另一个列表里的所有元素
还有另一个方法:只是没有用列表推导式,用了两个for循环,也能实现我想要的存储结构
nums = []
rows = eval(input("请输入行数:"))
columns = eval(input("请输入列数:"))
for row in range(rows):
nums.append([])
for column in range(columns):
#num = eval(input("请输入数字:"))
nums[row].append([])
print(nums,'\n')
#nums[1][0].append(255)
#nums[1][0].append(0)
#print(nums,'\n')
#print(nums[1][0][1])
=============================
再记一个常见错误:
IndexError: list index out of range
刚开始做自动化测试,遇到这个问题IndexError: list index out of range
百度一下找到了答案,我只是整理一下
这个错误出现大约有两种情况:
第1种可能情况
list[index]index超出范围
第2种可能情况
list是一个空的 没有一个元素
进行list[0]就会出现该错误
原文:https://blog.csdn.net/zhoubbt/article/details/53673637
问题还会出在数据集上,一定不能让数据集上下有空行,注意,尤其第一行不能空白(最容易忽视的问题)
这个小小的bug困扰了一整天,总结来看,编程 格式很重要。
bug天天有,总在细节处 解决好细节 就功成一半了。
以上全部来自百度
=====================================
为了实现这个存储结构 查了许多资料问了许多人 顺便被补了一把extend和append的知识 其实这个问题我留了好多天了 今天终于被解决并发现 程序出现问题最好的办法就是手动来一遍 很容易就能发现问题在哪里 另外自己还是 稳不住呐 一找到一些存在感 就开始瞎皮 皮个锤子... 希望以后能改改自己的臭毛病了哭唧唧 冷静 谦和 三思而言 三思而行