使用嵌套列表/嵌套循环

3

我正在尝试弄清如何在Python中使用嵌套列表/嵌套循环。我需要编写函数来创建一个新表,该表由以列表形式添加2个输入表的索引组成。例如,如果函数是addTables,那么我将运行:

addTables([[1,1],[1,1]],[[2,2],[2,2]])

我会得到:

[[3,3],[3,3]]

我有些困惑,首先,当我运行我的代码时,我写的函数返回[3,3,3,3]:

def addElements(element1,element2):
    newlist = []
    for i in range(0,len(element1)):
        for j in range(0,len(element1[i])):
            new_element = element1[i][j] + element2[i][j]
            newlist.append(new_element)
    return newlist

其次,我们应该使用多个函数。我不知道如何拆分程序,以便不同的部分由不同的函数完成。能否有人指点一下我正确的方向?任何提示都将不胜感激。


1
尝试运行 import numpy as np; print(np.add([[1,1],[1,1]],[[2,2],[2,2]])) - cs95
3个回答

5

首先使用嵌套的for循环

def addTables(first, second):
    new_table = []
    for i in range(len(first)):
        new_list = []
        for j in range(len(first[0])):
            new_list.append(first[i][j] + second[i][j])
        new_table.append(new_list)
    return new_table

>>> addTables([[1,1],[1,1]],[[2,2],[2,2]])
[[3, 3], [3, 3]]

另一种做法是将其拆分为两个函数。第一个函数可以添加两个列表,然后外部函数可以调用它来添加表格。
def addLists(first, second):
    new_list = []
    for i in range(len(first)):
        new_list.append(first[i] + second[i])
    return new_list

def addTables(first, second):
    new_table = []
    for i in range(len(first)):
        new_table.append(addLists(first[i], second[i]))
    return new_table

>>> addTables([[1,1],[1,1]],[[2,2],[2,2]])
[[3, 3], [3, 3]]

更简洁地说,这可以使用嵌套列表推导式来完成。
def addTables(first, second):
    return [[i+j for i,j in zip(a, b)] for a, b in zip(first, second)]

>>> addTables([[1,1],[1,1]],[[2,2],[2,2]])
[[3, 3], [3, 3]]

最后,您可以在未来使用 numpy ,它可以非常高效地执行线性代数运算。

import numpy as np

def addTables(first, second):
    return np.array(first) + np.array(second)

>>> addTables([[1,1],[1,1]],[[2,2],[2,2]])
array([[3, 3],
       [3, 3]])

2
您没有初始化内部列表。要做到这一点,您需要在外部循环体的开头附加新行。不过,还有一个更简单的方法。看看标准库的威力:
[[a+b for a,b in zip(arow, brow)] for arow, brow in zip(element1, element2)]

zip 的作用是将两个或多个可迭代对象中的元素配对,比如你的列表。另一个技巧是使用列表推导式来构建新表格。


很酷,但你能将你的方法推广到任意大小的矩阵吗?比如,有任意数量的行。 - Arthur Spoon
试一下,然后回复我 ;) - SwiftsNamesake
嵌套两个级别的原因与通常为2D数组嵌套两个循环的原因相同。只要不将其变成3D或4D数组,就应该没问题。 - SwiftsNamesake
1
哦,我刚刚被你对“arow”和“brow”的表示法搞混了,我想 ^^ 但是现在我戴上了我的思考帽,完全理解了。 - Arthur Spoon
好的。希望这回答了你的问题。 - SwiftsNamesake

1
您的代码问题在于想要返回一个嵌套列表,但是您只创建并将结果附加到了一个简单的列表中。因此,基本上您的代码应该像这样:
def addElements(element1,element2):
    global_result = []
    for i in range(len(element1)):
        # For each line, create a lower level list
        row_result = []
        for j in range(len(element1[i])):
            new_element = element1[i][j] + element2[i][j]
            row_result.append(new_element) # Add element to your low-level list
        # After the loop on the columns, add the row result to your global list
        global_result.append(row_result)
    return global_result

关于将其制作为多个函数,我也不太确定...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接