Python读取CSV转字典并转换布尔字符串:如何实现更Pythonic的写法?
更Pythonic的CSV转字典并转换布尔值实现方案
问题描述
现有一段可正常运行的代码,能够读取CSV文件数据并将其转换为Python字典,同时将True、false这类布尔字符串转换为对应的布尔类型,希望优化为更符合Python风格的写法:
def _load_metadata(path): """Loads the metadata from the given file and converts boolean strings to booleans.""" filedict = {} with open(path) as csvfile: reader = csv.DictReader(csvfile, delimiter=",") for row in reader: newrow = {} for key, value in dict(row).items(): if value.lower() == "false": newrow[key] = False elif value.lower() == "true": newrow[key] = True else: newrow[key] = value filedict[row["name"]]= newrow return filedict
优化后的Pythonic实现
import csv def _load_metadata(path): """Loads the metadata from the given file and converts boolean strings to booleans.""" # 定义布尔字符串到布尔值的映射,可扩展其他转换规则 bool_mapping = {"true": True, "false": False} with open(path) as csvfile: reader = csv.DictReader(csvfile, delimiter=",") # 嵌套字典推导式直接构建结果 return { row["name"]: { key: bool_mapping.get(value.lower(), value) for key, value in row.items() } for row in reader }
优化点说明
- 嵌套字典推导式:替代多层for循环与中间变量初始化,代码更紧凑简洁,符合Python"写更少代码做更多事"的风格。
- 映射字典+get方法:用
bool_mapping集中管理布尔字符串的转换规则,避免冗余的if-elif判断;dict.get()方法一次完成"匹配转换/保留原值"的逻辑,减少重复调用value.lower()的开销。 - 移除冗余操作:原代码中
dict(row).items()是多余的,row本身就是DictReader返回的字典对象,直接调用row.items()即可。 - 直接返回结果:省去初始化
filedict和newrow的步骤,减少不必要的中间变量,提升代码可读性与效率。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

