返回python中for循环的值

jbc*_*tin 2 python loops return

我试图弄清楚在for循环语法中将参数从一个列表或dict传递给另一个的语法.

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

 for bean in beans:
  if bean.type == 'coffee':
   print bean
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 10

[bean for bean in beans if bean.type == 'coffee']
Run Code Online (Sandbox Code Playgroud)

列表理解很整洁.甚至更整洁,通常你不需要生成一个完整的列表 - 你只需要一个迭代器来为你提供列表所包含的值.这是一个生成器,它们可以通过生成器表达式简洁地表达.这些是以与列表推导相同的方式编写的,除了方括号变为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深度嵌套的通用解决方案,您需要使用递归的完整函数.


Mac*_*cke 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
Run Code Online (Sandbox Code Playgroud)

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

  • 在所有情况下,写出一个完整的发电机是过度的.这也不例外.如果生成器表达式有效,那就这样吧. (2认同)