如何在 Python 中的一行中编写条件 for 循环?

Posted

技术标签:

【中文标题】如何在 Python 中的一行中编写条件 for 循环?【英文标题】:How do I write conditional for loops in one line in Python? 【发布时间】:2014-09-20 04:59:49 【问题描述】:

比如,我怎么能凝练

In [1]: for x in xrange(1,11):
...:     if x%2==0:
...:         print x

排成一行?

编辑:谢谢大家!这正是我想要的。 不过,为了让这更具挑战性,有没有一种方法可以添加 elif & else 并且仍然保持在一行上?

使用前面的例子,

for x in xrange(1,11):
   if x%2==0:
      print x
   else
      print "odd"

【问题讨论】:

没有“unix”编程语言。这看起来像 Python。 One line condition in bash的可能重复 “在 unix 上”?就像“在 shell 脚本中”一样? 你为什么要这样做? from subprocess import *; open('badcode.c', 'wb').write('#include <stdio.h>\nint main()for (int x=1; x!=11; x++) if (x%2 == 0) printf("%d\n", x);\n'); subprocess.check_call(['cc', '-o', 'badcode', 'badcode.c'; subprocess.check_call(['./badcode']) 【参考方案1】:

对于您的具体示例:

for x in xrange(2, 11, 2): print x

更一般地说,就是否可以将块嵌套在一行而言,答案是否定的。解释compound statements 上的文档,如果“套件”采用单行形式,则它可能不包含嵌套的复合语句。 “套件”是由子句控制的一组语句(如条件块或循环体)。

【讨论】:

是的,在复合语句中,冒号后面必须跟一个简单语句(即没有自己的冒号)或缩进块。 @abarnert 感谢您的确认。我在回答中添加了更多细节。【参考方案2】:

可能是这样的:

from __future__ import print_function

map(print, [x for x in xrange(1,11) if x % 2 == 0])

【讨论】:

这行得通,但是使用map 来映射副作用很难看。此外,在 Python 3.x 中,它不会做任何可见的事情,因为 map 只是返回一个(惰性)迭代器,如果你从不迭代它,那些 print 调用都不会被评估。【参考方案3】:

这并不完全相同,也不是“一行”,但请考虑消除副作用并使用列表过滤器/理解。

evens = [x for x in xrange(1,11) if x % 2 == 0]
print "\n".join(evens)
# or (now a saner "one line", the evens-expr could even be moved in-place)
for x in evens: print x

【讨论】:

你的join 倒退了。在 Python 中,字符串连接可迭代对象,而不是相反。 @abarnert 谢谢,我太傻了——我已经更正了代码。 不,这仍然是错误的。 str.join 首先采用 str,然后是可迭代的。但是无论如何,您应该将其作为普通方法调用,而不是未绑定方法。如果您不介意,我会对其进行编辑(如果您不喜欢,可以随时撤消我的编辑)。【参考方案4】:
for x in [y for y in xrange(1,11) if y%2==0]:
  print x

【讨论】:

你在列表理解的末尾写了x 而不是y @Gregor 谢谢!这是一个错字。

以上是关于如何在 Python 中的一行中编写条件 for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如果满足 for 循环中的条件,则在同一行中的其他单元格中获取值

如果行中的指定值与条件匹配,则从 CSV 返回一行

如何在 django 模板中从 for 循环中转义一行

如何有条件地跳过python中for循环中的迭代步骤数?

如何在一行中编写嵌套的 if-elif-else 条件? [复制]

如何使用 Python 中的 for 循环用回车覆盖一行?