用循环在列表中添加元素


最近在进行数据处理,需要通过计算得到数据,再将数据用来绘图,其中还要取出个别数据进行处理。因此数据与数据之间存在嵌套,为了更好地调用数据,决定 使用列表来存储数据,这样在后期调用数据时就可以用 遍历列表的方法进行调用。
本次数据存储主要是以下过程:
过程一:计算得到数据一维列表 [ ](假设有三个)
过程二:将过程一产生的多个列表存储在新的列表中,即 [[ ],[ ],[ ]](假设有两个)
过程三:将过程二产生的多个列表再次存储在新的列表中,即 [ [[ ],[ ],[ ]], [[ ],[ ],[ ]] ]
实现这三个过程可以结合 for循环来进行,在调试过程中,我遇到了列表元素总是都是跟最后一次运行的元素相同,前面保存的元素都被它覆盖了。在解决这个问题时,我看了很多博主的博客,调了很久才终于成功。

for循环+将数据存储在列表

一般我们给列表后面逐一添加元素都会想到用append(),如:

LL=[]
for j in range(0,2):
    L=[]#建立空列表,注意该列表不要放在循环外,不然元素会出现重复添加
    for i in range(0,2):
        OH=[i,j]
        L.append(OH)
        print("L",L)
    LL.append(L)
    print("LL",LL)

【运行结果】
L [[0, 0]]
L [[0, 0], [1, 0]]
LL [[[0, 0], [1, 0]]]
L [[0, 1]]
L [[0, 1], [1, 1]]
LL [[[0, 0], [1, 0]], [[0, 1], [1, 1]]]
但当数据非常多且复杂时,用append()就会出现输出的元素总是只跟最后一个相同,即上面的列表变为:
LL [[[1, 0], [1, 0]]]
L [[1, 1], [1, 1]]
LL [[[1, 1], [1, 1]], [[1, 1], [1, 1]]]
因此,为了后面添加的数据不再覆盖前面的数据,有以下几种方法可以尝试,不过本人实践证明,这估计跟自己的数据量以及类型优点关系,所以不是所有方法都通用的,我也只能将它记录下来用作参考。

方法一

先给空列表中再次添加一个空元素,然后再添加元素,即:

LL1=[]
for j in range(0,2):
    L1=[]
    L1s=[]
    for i in range(0,4):
        OH=[i,j]
        L1s.append(i)#这里用多一个列表进行过渡
        L1s[i]=L1.append(OH)
        print("L1s",L1s)
    LL1.append(L1)
    print("LL1",LL1)  

【运行结果】
L1s [None]
L1s [None, None]
L1s [None, None, None]
L1s [None, None, None, None]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]]]
L1s [None]
L1s [None, None]
L1s [None, None, None]
L1s [None, None, None, None]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]], [[0, 1], [1, 1], [2, 1], [3, 1]]]

然后这里用的 i 还是不够好,于是可以把i改为 [ ] ,即:

LL1=[]
for j in range(0,2):
    L1=[]
    for i in range(0,4):
        L1.append([])#这里先添加空元素,避免访问错误
        OH=[i,j]
        L1[i]=OH
        print("L1",L1[i])
    LL1.append(L1)
    print("LL1",LL1[j])  

【运行结果】
L1 [[0, 0]]
L1 [[0, 0], [1, 0]]
L1 [[0, 0], [1, 0], [2, 0]]
L1 [[0, 0], [1, 0], [2, 0], [3, 0]]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]]]
L1 [[0, 1]]
L1 [[0, 1], [1, 1]]
L1 [[0, 1], [1, 1], [2, 1]]
L1 [[0, 1], [1, 1], [2, 1], [3, 1]]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]], [[0, 1], [1, 1], [2, 1], [3, 1]]]
这个方法虽然可以,但是在后面想调用列表时,可以发现这种方法产生的列表外面多了一个框“[ ]”,就像剥洋葱时发现有一块金属片一样,因为我想不到咋去掉,于是便产生了方法2

方法二

尝试了很多方法后发现原来添加的元素不是被替换就是提示调用有问题,后来终于发现,问题可能是因为地址的问题,因此每次都要给一个新地址。(知识参考)

LL1=[]
for j in range(0,2):
    L1=[]
    for i in range(0,4):
        OH=[i,j]
        L1.append(list(OH))#这里在添加的列表前面加上list就可以起到作用
        print("L1",L1)
    LL1.append(L1)
    print("LL1",LL1)  

【运行结果】
L1 [[0, 0]]
L1 [[0, 0], [1, 0]]
L1 [[0, 0], [1, 0], [2, 0]]
L1 [[0, 0], [1, 0], [2, 0], [3, 0]]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]]]
L1 [[0, 1]]
L1 [[0, 1], [1, 1]]
L1 [[0, 1], [1, 1], [2, 1]]
L1 [[0, 1], [1, 1], [2, 1], [3, 1]]
LL1 [[[0, 0], [1, 0], [2, 0], [3, 0]], [[0, 1], [1, 1], [2, 1], [3, 1]]]
可以发现这里列表就少了一层,可以解决调用异常的问题。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐