Python嵌套列表/字典推导式如何返回预期结果?
问题根因
两种写法的结果不符合预期/触发报错,核心都是推导式嵌套层级和容器符号使用错误,不存在变量被自动合并的情况,本质是你生成的数据结构和预期结构不匹配。
嵌套列表推导式的问题
你写的代码外层、内层都用了方括号[],会生成两层嵌套的列表,实际返回结构如下:
[ [("name-tag-1", "rtb-123")], # 每个路由表对应一个内层列表,列表里才是你要的二元组 [("name-tag-2", "rtb-456")] ]
如果你直接遍历外层列表取元素,拿到的是包裹元组的内层单元素列表,不是元组本身,才会误以为两个值被合并成了一个元素。
字典推导式的报错问题
你外层用了大括号{},内层写的是key:value格式的字典语法,Python会把这个结构识别成集合推导式:集合要求所有元素都是可哈希类型,但你内层生成的是字典对象,字典本身不可哈希,自然触发TypeError: unhashable type: 'dict'报错。你想要的是平铺的字典,不是存储字典对象的集合。
正确写法
目标1:返回二元元组构成的列表
去掉内层多余的方括号,按推导式平铺语法书写两层循环,直接生成一维的元组列表:
table_info = [ (tag['Value'], table['RouteTableId']) for table in tables for tag in table['Tags'] if tag['Key'] == "Name" ]
目标2:返回Name标签为键、路由表ID为值的字典
外层直接用字典推导式语法,不要在内层多套一层大括号,同样平铺两层循环即可:
table_info = { tag['Value']: table['RouteTableId'] for table in tables for tag in table['Tags'] if tag['Key'] == "Name" }
提示:如果多个路由表存在相同的Name标签值,后面遍历到的路由表ID会覆盖前面的值,如果需要保留重复项,请选择元组列表的实现方式。
内容的提问来源于stack exchange,提问作者Yorick Robinson
相关产品推荐
相关产品推荐

