【问题标题】:Python list comprehension: test function returnPython列表理解:测试函数返回
【发布时间】:2012-11-29 18:27:00
【问题描述】:

有没有办法在列表(或字典)理解中测试函数的返回?我想避免这样写:

lst = []
for x in range(10):
  bar = foo(x)
  if bar:
    lst.append(bar)

并改用列表推导式。显然,我不想写:

[foo(x) for x in range(10) if foo(x)]

所以?

[foo(x) for x in range(10) if ??? ]

【问题讨论】:

  • 为什么不想使用第一种方式呢?这是合适的方式。
  • @Rohit Jain -- 取决于foo,这可能是一项昂贵的操作,您不想重复两次。
  • @mgilson:在第一个例子中,他只做了一次。
  • @TimPietzcker -- 啊……我以为 Rohit 指的是第一个列表理解……我现在正在关注评论流。谢谢。
  • @TimPietzcker.. 是的,我只是在谈论第一个列表理解。

标签: python list-comprehension


【解决方案1】:

怎么样

filter(None, map(foo, range(10)))

如果您不想保留中间列表,请将map() 替换为itertools.imap()。有了itertools.ifilter(),整个东西都可以变成一个生成器。

itertools.ifilter(None, itertools.imap(foo, range(10)))

【讨论】:

  • 或者,您可以使用 genexp:filter(None,(foo(x) for x in range(10))),而不是 imap
【解决方案2】:

只需制作一个生成器来计算值,然后从生成器构建过滤列表。

例子:

# create generator via generator expression
results = (foo(x) for x in xrange(10))
# build result list, not including falsy values
filtered_results = [i for i in results if i]

供参考:

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多