在包含多个for循环和算法的列表推导式中使用方法



我正在用python练习列表理解。试图创建一个列表的列表,指定一些条件。所以我写了这个程序:

def perm(x,y,z,n):
a = range(x+y+z)
b = []
for i in a:
for j in a:
for k in a:
if 0 <= i <= x and 0 <= j <= y and 0 <= k <= z and i+j+k != n:
b.append([i,j,k])
return b
print(perm(1,1,2,3))

[[0, 0, 0), [0, 0, 1], [0 0 2], [0, 1, 0], [0, 1, 1], [1, 0,0], [1, 0, 1], [1 1 0], [1, 2]]

这正是我想要的输出。但是如果我尝试使用列表推导:

return ([b.append(i) for i in a for j in a for k in a if 0 <= i <=x and 0 <= j <= y and 0 <= k <= z and i+k+j != n])
Or
return b.append[(i for i in a for j in a for k in a if 0 <= i <=x and 0 <= j <= y and 0 <= k <= z and i+k+j != n])

返回None或None的列表。

如何解决这个问题?我也在研究算法,并试图理解。我读了一些文章,但有些困惑。我有过这样的问题,我如何计算任何给定程序的效率,比如这个?有标准的方法吗?我怎么知道如果我必须改变我的代码,以获得最好的结果?如果有人可以用最基本的术语为我分解它,或者如果这个主题太大而无法涵盖,那么指向一些资源将会有很大的帮助。谢谢!

list.append不返回None。你需要做的:

def perm(x,y,z,n):
a = range(x+y+z)
return [[i,j,k] for i in a for j in a for k in a if 0 <= i <= x and 0 <= j <= y and 0 <= k <= z and i+j+k != n]

一般来说,以下两个是等价的(变量名称只是随机的,它们与您的示例无关):

lst = []
for a in x:
for b in y:
if c:
lst.append(d)
lst = [d for a in x for b in y if c]

最新更新