我正在试图找出在for循环语法中将参数从一个列表或dict传递到另一个列表的语法。
我正在寻找的理想结果是:
for bean in beans:
if bean.type == 'coffee':
print bean
只是,而不是打印到stdout,我想收集该字符串数据并将其附加到另一个列表。最终扁平化列表。
踢球者,我想在一行中执行此操作。
我知道'.join()方法,我正在寻找这个结果,所以我可以从for-in循环过滤结果。
答案 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'])