【问题标题】:using nested lists/nested loops使用嵌套列表/嵌套循环
【发布时间】:2026-01-16 06:40:01
【问题描述】:

我正在尝试弄清楚如何在 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

其次,我们应该使用多种功能。我不知道如何拆分程序,以便不同的部分由不同的功能完成。有人能指出我正确的方向吗?任何提示将不胜感激。

【问题讨论】:

  • 试试import numpy as np; print(np.add([[1,1],[1,1]],[[2,2],[2,2]]))

标签: python list nested


【解决方案1】:

首先使用嵌套的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 所做的是将两个或多个可迭代对象(例如列表)中的元素配对。另一个“技巧”是使用列表推导来构建新表。

    【讨论】:

    • 这很酷,但你能将你的方法推广到任何大小的矩阵吗?就像,有任意数量的行。
    • 试试看然后回复我 ;)
    • 存在两层嵌套的原因与通常为二维数组有两个嵌套循环的原因相同。只要你不把它做成 3D 或 4D 数组,你应该没问题。
    • 哦,是的,我实际上只是被你的 arowbrow 的符号弄糊涂了,我想 ^^ 但是现在我把我的思维上限放在了上面
    • 好。希望能回答你的问题。
    【解决方案3】:

    您的代码的问题是您想要返回一个嵌套列表,但您只是在创建一个简单的列表并将结果附加到一个简单的列表中。所以基本上你的代码应该看起来像

    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
    

    至于把它变成多个功能,我也不太确定......

    【讨论】: