繁体   English   中英

For Python中的循环和else语句

[英]For loops and else statements in Python

我在jinja2模板框架中为python使用了一些条件for循环。 我想知道是否有办法在jinja2之外做同样的事情,类似于:

{% for i in a if i == 1 %}
  {{ i }}
{% else %}
  no items
{% endfor %}

当我在普通的'蟒蛇'中尝试这个时,它不喜欢它

>>> for i in a if i == 1:

SyntaxError: invalid syntax

我希望能做的是这样的:

for i in a if i == 1:
    print i
else:
    print 'no matches found'

你已经非常接近了,所需要的只是一个列表理解,它形成一个只包含a等于1的值的列表。

在python中, for..else语句也是有效的

for i in [x for x in a if x == 1]:
    print i
else:
    print 'no matches found'

这将打印在所有的值a1 ,除非没有被发现。 然后它打印no matches found

正如davidism所提到的,为了防止对整个列表进行中间评估,您可以使用生成器而不是LC:

for i in (x for x in a if x == 1):
    print i
else:
    print 'no matches found'

您可以使用带有循环语句的else块。 如果循环流不受诸如break的语句的干扰,则它将落入else块。 我在下面添加了一个简单的素数查找器

 for n in range(2, 10):
     for x in range(2, n):
         if n % x == 0:
             print n, 'equals', x, '*', n/x
             break
     else:
         # loop fell through without finding a factor
         print n, 'is a prime number'

输出:

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3


注意:如果将for / else语句与列表推导结合使用for可以完成所需的操作。 简单的列表理解:

# For generating a list of odd numbers from 1 to 10
[n for n in range(1, 10) if n % 2 == 1]

# Generator version preventing evaluation of the whole list at once.
(n for n in range(1, 10) if n % 2 == 1)


这样你就可以生成一个带有列表iterable方法的iterable容器,并使用for / else循环迭代它:

for n in [n for item_container if n == 1]
    # Do work
    pass
else:
    # Loop falls through if the flow isn't disturbed
    # Do some other work
    pass


编辑:您要问的只是检查元素是否在容器中,然后执行语句。 这非常低效。 使用CPython set数据结构(Python最常见的实现)可以更快地完成这项工作。

  • 您的代码在平均和最差情况下具有O(n)复杂度。
  • set构件检查将在平均和为O(n)在最坏的情况有O(1)( dictionary也有类似的实现)。

所以下面的代码会快得多

element = 9
container = set(range(1, 10))

print("Match Found." if element in container else "Match Not Found.")


有关更多信息,请查看以下

如果您只想要列表中的值:

items = [i for i in a if i == 1]

打印出来,如果没有匹配则包括备注:

for i in items:
    print i
if not items:
    print 'no matches found'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM