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

新手上路,请多包涵

我知道如何在不同的行上同时使用 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])

但是我在任何地方都找不到一个很好的例子(可以复制和学习)来演示一组复杂的命令(不仅仅是“打印 x”),这些命令在 for 循环和一些 if 语句的组合之后发生。我期望的东西看起来像:

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

这不是 python 应该工作的方式吗?

原文由 ChewyChunks 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 258
2 个回答

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

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

for x in gen:
    print(x)

原文由 Kugel 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据 Python 之禅(如果您想知道您的代码是否是“Pythonic”,那就是去的地方):

  • 美丽总比丑陋好。
  • 显式优于隐式。
  • 简单胜于复杂。
  • 扁平比嵌套好。
  • 可读性很重要。

获得两个 set sorted intersection 的 Pythonic 方法是:

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

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

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

但是对于更复杂的循环,您可能希望通过迭代命名良好的 生成器表达式 和/或调用命名良好的函数来将其展平。试图将所有内容都放在一条线上很少是“Pythonic”。


在对您的问题和接受的答案的其他评论之后更新

我不确定你想用 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

原文由 johnsyweb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题