返回python中for循环的值

时间:2011-02-27 19:04:24

标签: python loops return

我正在试图找出在for循环语法中将参数从一个列表或dict传递到另一个列表的语法。

我正在寻找的理想结果是:

 for bean in beans:
  if bean.type == 'coffee':
   print bean

只是,而不是打印到stdout,我想收集该字符串数据并将其附加到另一个列表。最终扁平化列表。

踢球者,我想在一行中执行此操作。

我知道'.join()方法,我正在寻找这个结果,所以我可以从for-in循环过滤结果。

3 个答案:

答案 0 :(得分:10)

[bean for bean in beans if bean.type == 'coffee']

List comprehensions很整洁。甚至更整洁,通常你不需要生成一个完整的列表 - 你只需要一个迭代器来为你提供列表所包含的值。这是一个生成器,它们可以通过生成器表达式简洁地表达。这些是以与列表推导相同的方式编写的,除了方括号变为parens(如果它是函数调用中唯一的参数,则可以省略它们),例如'\n'.join(str(bean) for bean in beans if bean.type == 'coffee')。优点是提到的懒惰,即你真的需要(请求)之前你永远不会生成值,并且你不会同时将所有值保存在内存中(除非消费者这样做)。

您可以使用itertools.chain将多个可迭代(包括列表)链接到一个,或者如果您无法更改您获得列表的事实,则可以使用(x for list in lists for x in list)。对于涉及abritary深度嵌套的通用解决方案,您需要使用递归的完整函数。

答案 1 :(得分:8)

一个班轮将使用列表或生成器理解,请参阅Blair的答案。

适应当前代码将适合yield关键字,这允许您构建这样的生成器函数:

def coffee_filter(beans):
    for bean in beans:
       if bean.type == 'coffee':
           yield bean

for bean in coffee_filter(beans):
    print "coffee from %s" % bean.country

因为python允许你在任何地方定义函数,所以这非常有用。

答案 2 :(得分:1)

'\n'.join([str(bean) for bean in beans if bean.type == 'coffee'])