[英]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.