如何编写包含 If Else 条件的列表理解
How to compose list comprehension including If Else conditions
什么是简单的列表理解(不使用任何新模块或字典)得到如下输出:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
这里每个1
s之间的0
s的数量从0增加到10倍。
在不使用列表理解的情况下,我使用简单的 for 循环获得了输出:
for i in range(12):
if i==0:
print(1, end=", ")
else:
for j in range(i):
if i==j+1:
print(1, end=", ")
else:
print(0, end=", ")
只是想看看如何将这些循环转换为列表理解
您可以生成 1
的列表,然后使用此列表理解生成越来越多的 0
:
[[1] + [0] * i for i in range(n)]
对于 n = 4
,这将产生:
[[1], [1, 0], [1, 0, 0], [1, 0, 0, 0]]
您可以通过将列表嵌套在另一个理解中来展平该列表,然后添加尾随 1
:
res = [i for sub in [[1] + [0] * i for i in range(n)] for i in sub] + [1]
同样,对于 n = 4
这会产生:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]
如果你可以使用库,你可以使用itertools.chain.from_iterable
来展平列表:
res = list(itertools.chain.from_iterable([1] + [0] * i for i in range(n))) + [1]
输出是一样的。
正如@KellyBundy 在评论中指出的那样,可以通过将上述代码中的最内层理解更改为
来删除尾随 1
的需要
[0] * i + [1] for i in range(-1, n)
这利用了 [0] * n = []
对应 n <= 0
这一事实。对于 n = 4
这直接产生
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]
嵌套列表理解的答案非常有效。这是使用一个列表理解的替代方法:
N = 5 # Max number of 0s between 1s
ans = [1 if i == 0 else 0 for limit in range(N+2) for i in range (limit)] + [1]
ans
内容如下:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]
这个问题要求“一个简单的列表理解”来输出有问题的列表,但到目前为止的其他两个答案需要一个额外的硬编码列表与列表理解生成的列表相结合,这不是问题要求。
要做到这一点,只需使用列表理解,您可以将内部循环的范围增加 1,这样您就可以在 i
为 0 时生成额外的 1,并使用 if
子句来为其余迭代过滤额外的 0 的输出:
[1 if i == j else 0 for i in range(12) for j in range(i + 1) if j > 0 or i == 0]
什么是简单的列表理解(不使用任何新模块或字典)得到如下输出:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
这里每个1
s之间的0
s的数量从0增加到10倍。
在不使用列表理解的情况下,我使用简单的 for 循环获得了输出:
for i in range(12):
if i==0:
print(1, end=", ")
else:
for j in range(i):
if i==j+1:
print(1, end=", ")
else:
print(0, end=", ")
只是想看看如何将这些循环转换为列表理解
您可以生成 1
的列表,然后使用此列表理解生成越来越多的 0
:
[[1] + [0] * i for i in range(n)]
对于 n = 4
,这将产生:
[[1], [1, 0], [1, 0, 0], [1, 0, 0, 0]]
您可以通过将列表嵌套在另一个理解中来展平该列表,然后添加尾随 1
:
res = [i for sub in [[1] + [0] * i for i in range(n)] for i in sub] + [1]
同样,对于 n = 4
这会产生:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]
如果你可以使用库,你可以使用itertools.chain.from_iterable
来展平列表:
res = list(itertools.chain.from_iterable([1] + [0] * i for i in range(n))) + [1]
输出是一样的。
正如@KellyBundy 在评论中指出的那样,可以通过将上述代码中的最内层理解更改为
来删除尾随1
的需要
[0] * i + [1] for i in range(-1, n)
这利用了 [0] * n = []
对应 n <= 0
这一事实。对于 n = 4
这直接产生
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]
嵌套列表理解的答案非常有效。这是使用一个列表理解的替代方法:
N = 5 # Max number of 0s between 1s
ans = [1 if i == 0 else 0 for limit in range(N+2) for i in range (limit)] + [1]
ans
内容如下:
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]
这个问题要求“一个简单的列表理解”来输出有问题的列表,但到目前为止的其他两个答案需要一个额外的硬编码列表与列表理解生成的列表相结合,这不是问题要求。
要做到这一点,只需使用列表理解,您可以将内部循环的范围增加 1,这样您就可以在 i
为 0 时生成额外的 1,并使用 if
子句来为其余迭代过滤额外的 0 的输出:
[1 if i == j else 0 for i in range(12) for j in range(i + 1) if j > 0 or i == 0]