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深度嵌套的通用解决方案,您需要使用递归的完整函数.
一个班轮将使用列表或生成器理解,请参阅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允许你在任何地方定义函数,所以这非常有用.
| 归档时间: |
|
| 查看次数: |
18735 次 |
| 最近记录: |