【问题标题】:Creating a list using a nested for loop in python在python中使用嵌套for循环创建列表
【发布时间】:2013-12-14 19:47:10
【问题描述】:

我正在尝试使用 python 中的嵌套 for 循环创建一个列表。该列表需要由多个列表组成,每个列表对应于某个参数的值,并包含该参数的方程结果。运行我的代码会产生一个IndexError。这是导致问题的代码部分:

T_1 = [[]]

for j in range(len(A_1)):
        for i in range(len(y_1)):
             T_1[j][i] = T0_1 + ((q0_1 / k_1) * y_1[i]) - ((A_1[j] / (2 * k_1)) * y_1[i]**2)

序列A_1y_1 的大小不同(y_1 是一个 150 长的深度点列表,A_1 是一个 4 字符长的参数 A 的不同值的列表)。

【问题讨论】:

  • Python 称这些“列表”; array 是不同的(仅包含一种类型的值,请参阅 Python 中的 array 模块)。

标签: python list loops for-loop nested


【解决方案1】:

Python 列表不会自动增长;解决不存在的索引不起作用。您通常会为此使用.append()

T_1 = []

for a in A_1:
    nested = []
    T_1.append(nested) 
    for y in y_1:
        nested.append(T0_1 + ((q0_1 / k_1) * y) - (a / (2 * k_1)) * y**2))

请注意,您不再需要创建索引;您可以直接A_1y_1 上循环并使用公式中的值。

另一种方法是使用占位符值创建一个空结构;喜欢None:

T_1 = [[None] * len(y_1) for _ in range(len(A_1))]

for i, a in enumerate(A_1):
    for j, y in enumerate(y_1):
        T_1[i][j] = T0_1 + ((q0_1 / k_1) * y) - (a / (2 * k_1)) * y**2))

这里我使用enumerate()为每个循环添加一个索引;这可以让你拥有你的蛋糕吃掉它;访问输入序列中的值及其在序列中的位置。

但是,您的嵌套列表可以最简单地使用一组嵌套的list comprehensions 生成:

T_1 = [[T0_1 + ((q0_1 / k_1) * y) - ((a / (2 * k_1)) * y**2) for i in y_1] for a in A_1]

这里[expression for variable in iterable] 为循环的每次迭代执行左侧的表达式。 A_1 上的外部循环为循环中的每个 a 生成一个新列表。该新列表本身就是一个列表推导,循环遍历 y_1 并为每个元素生成新值(您的公式)。

请注意,现在我们不再需要生成索引在每次循环迭代时使用list.append()。列表是就地构建的。

【讨论】:

  • 非常感谢大家的回复,我已经解决了问题,继续程序。
【解决方案2】:
T_1 = [[T0_1 + ((q0_1 / k_1) * y_1[i]) - ((A_1[j] / (2 * k_1)) * y_1[i]**2) for j in range(len(A_1))] for i in range(len(y_1))]

【讨论】:

  • 当您使用ij 来索引y_1A_1 时,为什么还要使用range(len(y_1))range(len(A_1))?为什么不直接在这些序列上循环呢?
  • 是的,我给出了快速的答案,复制粘贴...for x in A_1 和 x 而不是 A_1[j]
【解决方案3】:

简答

T_1 = []  # outer list, all rows
for j in range(len(A_1)):
    T_1.append( [] )  # new inner list, a row
    for i in range(len(y_1)):
        # last row is T_1[-1] and you append to it
        your_value = T0_1 + ((q0_1 / k_1) * y_1[i]) - ((A_1[j] / (2 * k_1)) * y_1[i]**2)
        T_1[-1].append(your_value)

参考

L = [ [1, 2, 3],
      [4, 5, 6],
      [7, 8, 9] ]

L[0]  -> [1, 2, 3]
L[1]  -> [4, 5, 6]
L[2]  -> [7, 8, 9]
L[-1] -> [7, 8, 9]

L[0][0] -> 1
L[1][0] -> 4
L[-1][-1] -> 9

您可能希望通过列表理解来做到这一点。
此时甚至不要尝试。
因为你会犯很多错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2019-04-23
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多