如何编写包含 If Else 条件语句的列表推导式

3

如何使用简单的列表推导式(不使用任何新模块或字典)得到以下输出:

[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 之间的 0 的数量从 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=", ")

我想看看这些循环如何转换为列表推导式

3个回答

6
您可以使用以下列表推导式生成由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)

这利用了这样一个事实:n <= 0 时,[0] * n = []。对于 n = 4,这直接产生结果。
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]

@Prashant 不用担心 - 希望你注意到我编辑了代码,因为我意识到我的原始代码没有将尾随的1添加到输出中。 - Nick
稍作变化: list(itertools.chain.from_iterable([0] * i + [1] for i in range(-1, n))) - Kelly Bundy
@KellyBundy 不错!我喜欢使用 [0]*-1,但我想知道它是否可能在未来出现问题。如果你不介意的话,我会把它加到答案里。 - Nick
这是文档记录(见注释2),并且肯定有一些代码依赖它,因此不太可能更改。当然,如果您喜欢,可以包含它。 - Kelly Bundy
@KellyBundy 感谢您提供的链接 - 我找了很久都没有找到。搜索词不对...我已经更新了答案,并加上了归属。 - Nick
显示剩余2条评论

2

使用嵌套列表推导的答案效果很好。这里提供一种替代方案,只使用一个单一的列表推导:

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]
< p > ans 的内容如下:

[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]

这仍然需要一个硬编码列表与由列表推导产生的列表连接,这并不是问题所要求的。 - blhsing

0
问题要求“使用简单的列表推导”输出所需的列表,但到目前为止其他两个答案需要将一个额外的硬编码列表与由列表推导生成的列表相结合,这不是问题所要求的。
为了只使用列表推导来实现,您可以将内部循环的范围增加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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接