2013-11-28 75 views
0

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

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)。

+1

Python调用这些'列表';一个'array'是不同的(包含一个类型的值,请参阅Python中的'array'模块)。 –

回答

0

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()每个循环迭代。这些清单是内置的。

+0

非常感谢大家的回复,我解决了这个问题并继续了这个程序。 – user3046814

0
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))] 
+0

当你使用'i'和'j'来索引'y_1'和'A_1'时,为什么使用'range(len(y_1))和'range(len(A_1))'?为什么不直接循环这些序列呢? –

+0

是的,我给出了快速的答案,复制粘贴... ...在A_1中为x,x代替A_1 [j]。 – alinsoar

0

简短的回答

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 

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