【问题标题】:Can this Python loop be expressed more succinctly?这个 Python 循环可以更简洁地表达吗?
【发布时间】:2013-02-28 21:49:52
【问题描述】:

我遇到了一些 Python v2.7 代码,我已将其重构为:

for ssid in (ssid for ssid in overlaps
             if ssid != subseq_id and ssid not in merged):

但我觉得应该有一种不用两个for 语句就能表达的方法?

【问题讨论】:

  • 严格来说,这是一个包含一个列表理解的 for 语句,而不是两个 for 语句。关键字for 有两种用途,这是一种巧合。
  • @minopret 这不是一个列表推导,它是一个生成器表达式
  • 好的,是的,它产生一个惰性列表而不是严格列表,所以既然我说“严格”,我可能也已经深入研究了那个细节:-)

标签: python python-2.7 for-loop refactoring


【解决方案1】:

你可以使用filter():

for ssid in filter(lambda s: s != subseq_id and s not in merged, overlaps):
    # ...

或者你可以在循环中测试

for ssid in overlaps:
    if ssid == subseq_id or ssid in merged:
      continue
    # ...

【讨论】:

  • +1 表示第二个选项。如果您不希望 ssid == subseq_id 经常成为 True,那么交换测试可能会更有效
【解决方案2】:

根据您的数据(顺序并不重要,...),您可以使用集合:

excluded = set(merged)
excluded.add(subseq_id)
ssids = set(overlaps) - excluded
for ssid in ssids:
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2020-11-21
    • 2014-01-12
    • 2011-08-27
    • 2013-10-11
    • 2021-06-23
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多