Python:循环遍历列表推导式

7

有没有更简短的写法

for x in [x for x in X if a(x)]:
    <Do something complicated with x>

很遗憾,以下操作无法执行:

for x in X if a(x):
    <Do something complicated with x>

当然,我可以通过某种方式实现所需的结果。
for x in X:
    if a(x):
        <Do something complicated with x>

但这会增加一层额外的缩进。

2
在我看来,你最后一种可能性中的额外缩进的惩罚虽然存在,但由于增加的清晰度而得以弥补。 可读性至上 - Rory Daulton
1
我觉得我的第二个例子,即无法工作的那个,会很易读。最后一种可能性也不错,但我只是好奇是否有像第二个那样的可能性。 - Bananach
2个回答

5
  1. [b(x) for x in X if a(x)] 是最简单的方法,但会创建一个不必要的列表。

  2. map(b, (x for x in X if a(x))) 将使用生成器而不会创建不必要的列表。


1
如果你不打算实际运行生成器,那么map(b, (x for x in X if a(x)))的意义是什么?map(...)本身基本上是一个无操作(no-op)。你需要执行list(map(...))或者for x in map(...):pass。 (除非我们谈论的是Python 2,但在这种情况下,“不会创建不必要的列表”这一说法并不正确) - Aran-Fey
1
b(x) 实际上是代码块的表示... 我会更新我的问题。 - Bananach
1
@Bananach 你可以将它封装在一个函数中,这样它就是 b(x) - DeepSpace
1
是的,但这个问题的重点在于编写漂亮的代码,而不是解决方法。 - Bananach
1
这不是一个 100 行的代码块,而是一个仅在此情况下使用的 7 行代码块。 - Bananach
显示剩余3条评论

1

并非每个人都喜欢以下内容,但我相当喜欢 map 和 filter 函数,因为它们可以提高可读性...

list(map(b, filter(a, X))

它将实现您想要的,我认为更容易看到正在发生的事情。

@Elmex80s 是的,这不是最有效率的。这取决于使用情况。有时为了可读性而牺牲运行时间是值得的。 - Benjamin Rowell
使用列表推导式,您可以在一次操作中进行映射和过滤,这是真的。 - Elmex80s
@Elmex80s 是的,就我个人而言,我对列表推导式没有任何问题,它们非常棒;但对于那些不习惯这种语言的人来说,这是另一种选择。当然,你可以争论他们应该跨出这一步,学习列表推导式。 - Benjamin Rowell
b(x)实际上是一个代码块...我会更新我的问题。 - Bananach

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