如何从max()与推导式创建的Python生成器中读取值?
问题分析与解决方案
首先,你遇到的错误根源在于对max()函数的用法理解有误:
你写的代码b = (max(t["a"]) for t in dic)里,每次迭代时t["a"]是单个整数(比如4、7这些),而max()函数要求传入一个可迭代对象(比如列表、元组),直接给单个整数的话,Python会尝试遍历这个整数,自然会抛出TypeError: 'int' object is not iterable的错误,这就是你调用next(gen)时出错的原因。
正确的一行代码实现
要从字典列表的"a"键中找出最大值,你不需要先构建生成器再处理,直接把所有"a"的值的迭代器传给max()函数即可,一行代码搞定:
dic = [ { "a":4 }, { "a":7 }, { "a":5 } ] max_val = max(t["a"] for t in dic)
或者用列表推导式(生成器表达式更省内存,因为不需要一次性生成整个列表):
max_val = max([t["a"] for t in dic])
为什么你的生成器无法工作?
再回头看你的代码:生成器表达式(max(t["a"]) for t in dic)的每一次迭代都会执行max(t["a"]),而如前所述,单个整数不能作为max()的参数。哪怕你想逐个取出每个t["a"]的值,也不需要套max(),直接写成(t["a"] for t in dic),这样调用next(gen)就会依次返回4、7、5,但这不是你要的最大值,所以正确的做法是把整个生成器(或列表)传给max(),让max()自己遍历所有值找出最大的那个。
内容的提问来源于stack exchange,提问作者Solal
相关产品推荐
相关产品推荐

