在Python中从for循环返回值
我正在尝试弄清楚在for循环中如何把一个列表或字典中的参数传递到另一个列表或字典的语法。
我想要的结果是这样的:
for bean in beans:
if bean.type == 'coffee':
print bean
不过,我不是想把结果打印出来,而是想把这些字符串数据收集起来,然后添加到另一个列表中,最后把这个列表变成一维的。
关键是,我想在一行代码里完成这个操作。
我知道有个''.join()
的方法,我想要这个结果是为了能从for-in循环中筛选出结果。
3 个回答
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,有人可能在使用某个工具或库时,遇到了错误或者不明白的地方。这时候,他们会把问题写在一个叫做StackOverflow的网站上,寻求帮助。
在这个网站上,其他程序员会看到这些问题,并提供他们的建议或解决方案。这样,提问的人就可以得到帮助,同时也能让其他人学习到如何解决类似的问题。
总之,StackOverflow是一个程序员互相帮助、分享知识的地方,大家可以在这里找到很多有用的信息和解决方案。
'\n'.join([str(bean) for bean in beans if bean.type == 'coffee'])
一句话的写法可以用列表或生成器推导式,看看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允许你在几乎任何地方定义函数,这点非常有用。
[bean for bean in beans if bean.type == 'coffee']
列表推导式很酷。更酷的是,有时候你并不需要生成一个完整的列表——你只需要一个迭代器,它能给你列表中应该有的值。这就是生成器,它们可以通过生成器表达式来简洁地表示。生成器表达式的写法和列表推导式类似,只不过方括号变成了圆括号(如果它是函数调用中的唯一参数,你甚至可以省略它们),比如 '\n'.join(str(bean) for bean in beans if bean.type == 'coffee')
。这样做的好处就是“懒惰”,也就是说,只有在真正需要(请求)这些值的时候,才会生成它们,并且你不会同时把所有值都放在内存中(当然,除非使用它的地方这样做)。
你可以使用 itertools.chain
将多个可迭代对象(包括列表)连接成一个,或者如果你不能改变你得到的是列表的列表的事实,你可以使用 (x for list in lists for x in list)
。如果你需要一个可以处理任意深度嵌套的通用解决方案,就需要一个完整的函数来利用递归。