繁体   English   中英

Python:复杂的for循环

[英]Python: Complex for-loops

我正在通过一些代码来尝试理解一些Python机制,而我只是不了解。 我想这很简单,现在我也知道它的作用,但是我不知道它是如何工作的。 我了解for -loops的正常用法,但这在这里...我不知道。

备注:我知道一些Python,但我不是专家。

np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)])

第二段代码是我遇到的问题:

for i in range(len(u)):
        for j in range(len(v)):
            tmp+=[rm[i,j][k]*someFuction(name,u[i],v[j])[k] for k in range(len(rm[i,j])) if rm[i,j][k]]

最内部for -loop如何工作? 另外, if在这里做什么?

谢谢您的帮助。

编辑:对不起,代码是如此的不可读,我只是试图自己理解它。 S, rm是numpy矩阵, someFunction返回带有标量条目的数组,而tmp只是一个帮助变量

您的代码中有很多不同的概念。 让我们从最基本的开始。 Python 列表numpy数组具有不同的索引编制方法。 您还可以通过提供一个列表来构建一个numpy数组:

S_list  = [[1,2,3], [4,5,6], [7,8,9]]
S_array = np.array(S_list)

print(S_list)
print(S_array)

print(S_list[0][2]) # indexing element 2 from list 0
print(S_array[0,2]) # indexing element at position 0,2 of 2-dimensional array

结果是:

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

因此,对于您的第一行代码:

np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)])

您正在通过提供一个列表来构建一个numpy数组。 此列表是使用列表理解的概念构建的。 因此, np.array(...)方法中的代码:

[[[S[i,j]] for i in range(order+1)] for j in range(order+1)]

...相当于:

order     = 2
full_list = []
for j in range(order+1):
    local_list = []
    for i in range(order+1):
        local_list.append(S_array[i, j])
    full_list.append(local_list)

print(full_list)

结果是:

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

至于第二个片段,重要的是要注意,尽管通常numpy数组具有非常特定且恒定的(对于所有数组而言)单元格类型,但是您实际上可以将数据类型对象赋予numpy数组。 因此可以创建一个二维列表数组。 也可以创建3维数组。 两者都与索引rm[i,j][k]兼容。 您可以在以下示例中进行检查:

rm = np.array(["A", 3, [1,2,3]], dtype="object")
print(rm, rm[2][0]) # Acessing element 0 of list at position 2 of the array

rm2 = np.zeros((3, 3, 3))
print(rm2[0, 1][2])  # This is also valid

如下代码:

[rm[i,j][k]*someFuction(name,u[i],v[j])[k] for k in range(len(rm[i,j])) if rm[i,j][k]]

...可以这样写:

some_list = []
for k in range(len(rm[i,j])):
    if rm[i, j][k]: # Expecting a boolean value (or comparable)
        a_list = rm[i,j][k]*someFuction(name,u[i],v[j])
        some_list.append(a_list[k])

最后的细节是tmp+=some_list 当您汇总两个列表时,它们将被串联起来,如在以下简单示例中所示:

tmp = []
tmp += [1, 2, 3]
print(tmp)
tmp += [4, 5, 6]
print(tmp)

结果是:

[1, 2, 3]
[1, 2, 3, 4, 5, 6]

还要注意,将列表乘以数字实际上等同于将列表相加几次。 所以2*[1,2]将得到[1,2,1,2]

它是一种列表理解,尽管这是一个非常难以理解的列表。 尽管具有可读性,但有些人还是在做一些“蟒蛇般”的事情。 只需查找列表推导内容,然后尝试将其自己重写为传统的for循环即可。 列表推导非常有用,不确定我是否会在这里走那条路线。

列表理解的语法是

[var for var in iterable if optional condition]

因此,此底线可以这样重写:

for k in range(len(rm[i,j]):
    if rm[i,j][k]:
        tmp+= rm[i,j][k]*someFunction(name,u[i],v[j])[k]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM