Python双层列表推导式遍历数据库表提取列名相关问题求解
列表推导式正确写法说明
1. 循环顺序规则
多层嵌套for循环转列表推导式时,循环顺序要和原嵌套逻辑完全一致,从外层到内层依次书写。你最初写的第一个列表推导式语法、逻辑都完全正确,和你原生的两层for循环功能100%等价:
def list_columns(self): tables = self.list_tables() # 写法正确,和原嵌套for逻辑完全一致 col_list = [column for t in tables for column in tables[t].columns] return col_list
2. 结果“不一致”的原因
你观察到的返回结果差异和列表推导式本身无关,是Python对象的打印规则导致的:
- 单独执行
print(column)时,调用的是Column对象的__str__方法,输出的是表名.列名的简化字符串格式 - 打印整个列表时,列表会调用内部每个元素的
__repr__方法,输出的是包含字段类型、约束等完整信息的对象描述,不管你用原生for循环还是列表推导式,只要列表里存的是Column对象,打印整个列表都会是这个效果,属于正常表现。
3. 反向顺序报错的原因
你调整循环顺序后的写法有语法错误:推导式执行时会先运行外层循环,你把for column in tables[t].columns写在前面,此时变量t还没有被定义,自然会报Unresolved reference 't'的错误,这个写法本身不符合语法规则。
4. 实现预期输出的写法
如果你要返回表名.列名格式的字符串列表,只需要在推导式中主动将Column对象转为字符串即可:
def list_columns(self): tables = self.list_tables() col_list = [str(column) for t in tables for column in tables[t].columns] return col_list
这个写法返回的列表打印后就会和你单独打印每个column的结果完全一致。
内容的提问来源于stack exchange,提问作者alphaomega
相关产品推荐
相关产品推荐

