Pythonic的方式结合for循环和if语句

400 投票
13 回答
727084 浏览
提问于 2025-04-16 23:07

我知道怎么在不同的行上使用for循环和if语句,比如:

>>> a = [2,3,4,5,6,7,8,9,0]
... xyz = [0,12,4,6,242,7,9]
... for x in xyz:
...     if x in a:
...         print(x)
0,4,6,7,9

而且我知道当语句很简单时,可以用列表推导式把它们结合起来,比如:

print([x for x in xyz if x in a])

但是我找不到一个好的例子(可以复制和学习的),来展示在for循环和一些if语句结合后,执行一组复杂的命令(不仅仅是“打印x”)。我期待的样子是:

for x in xyz if x not in a:
    print(x...)

这难道不是Python应该工作的方式吗?

13 个回答

43

以下是来自被接受答案的简化版/一句话总结:

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]

for x in (x for x in xyz if x not in a):
    print(x)

12
242

注意到这个 generator 是保持在同一行的。这是在 python2.7python3.6 上测试的(注意 print 中的括号;)

老实说,即便如此,这样写也挺麻烦的:x 被提到次。

49

根据Python之禅(如果你想知道你的代码是否“符合Python风格”,可以去看看这篇文章):

  • 美观胜于丑陋。
  • 明确胜于隐晦。
  • 简单胜于复杂。
  • 扁平胜于嵌套。
  • 可读性很重要。

在Python中获取两个setsorted intersection的方式是:

>>> sorted(set(a).intersection(xyz))
[0, 4, 6, 7, 9]

或者那些在xyz中但不在a中的元素:

>>> sorted(set(xyz).difference(a))
[12, 242]

但如果你需要一个更复杂的循环,可能想通过遍历一个命名良好的生成器表达式来简化,或者调用一个命名良好的函数。试图把所有内容放在一行上,通常不是“Python风格”。


根据你问题的额外评论和接受的答案更新

我不太确定你想用enumerate做什么,但如果a是一个字典,你可能想用它的键,像这样:

>>> a = {
...     2: 'Turtle Doves',
...     3: 'French Hens',
...     4: 'Colly Birds',
...     5: 'Gold Rings',
...     6: 'Geese-a-Laying',
...     7: 'Swans-a-Swimming',
...     8: 'Maids-a-Milking',
...     9: 'Ladies Dancing',
...     0: 'Camel Books',
... }
>>>
>>> xyz = [0, 12, 4, 6, 242, 7, 9]
>>>
>>> known_things = sorted(set(a.iterkeys()).intersection(xyz))
>>> unknown_things = sorted(set(xyz).difference(a.iterkeys()))
>>>
>>> for thing in known_things:
...     print 'I know about', a[thing]
...
I know about Camel Books
I know about Colly Birds
I know about Geese-a-Laying
I know about Swans-a-Swimming
I know about Ladies Dancing
>>> print '...but...'
...but...
>>>
>>> for thing in unknown_things:
...     print "I don't know what happened on the {0}th day of Christmas".format(thing)
...
I don't know what happened on the 12th day of Christmas
I don't know what happened on the 242th day of Christmas
452

你可以像这样使用 生成器表达式

gen = (x for x in xyz if x not in a)

for x in gen:
    print(x)

撰写回答