如何将图片OCR结果分组存储的循环代码简化为字典推导式?
简化图片OCR结果的字典生成代码为字典推导式
首先得说明:字典推导式天生更适合一对一的映射场景,而你的原代码是一对多(一个key对应多个OCR结果),所以直接写推导式没法一步到位,得先把文件按key分组,再生成最终的字典。
另外,原代码里判断str(i[1]) != '_'的逻辑其实有点脆弱——如果哪天文件名格式微调(比如编号变成3位)就会失效,不如直接通过下划线分割来提取key,更健壮。
下面是优化后的简化代码,兼顾了字典推导式和可读性:
import os import pytesseract from itertools import groupby from operator import itemgetter # 第一步:生成(编号key, 完整文件路径)的列表 file_key_pairs = [ (filename.split('_')[0], os.path.join('images', filename)) for filename in os.listdir('images') ] # 第二步:按key分组,用字典推导式生成最终结果 data_dict = { key: [pytesseract.image_to_string(file_path) for _, file_path in group] for key, group in groupby(sorted(file_key_pairs, key=itemgetter(0)), key=itemgetter(0)) }
代码细节解释:
- 提取key的优化:用
filename.split('_')[0]直接获取下划线前的编号,不管是1位还是2位数字都能正确提取,比原代码的字符判断更靠谱。 - 完整文件路径:原代码里直接用
i(文件名)传给image_to_string可能会报错,因为当前工作目录不一定是images,所以用os.path.join拼接完整路径更稳妥。 - 分组与推导:先用列表推导式生成所有文件的key和路径对,再用
groupby按key分组(注意groupby需要先排序,所以先对列表按key排序),最后用字典推导式遍历每组,生成对应key的OCR结果列表。
如果不想引入itertools,也可以用collections.defaultdict先收集,再转成普通字典,这个版本比原代码更简洁,同时修复了路径问题:
import os import pytesseract from collections import defaultdict data_dict = defaultdict(list) for filename in os.listdir('images'): key = filename.split('_')[0] data_dict[key].append(pytesseract.image_to_string(os.path.join('images', filename))) # 转成普通字典(可选操作) data_dict = dict(data_dict)
内容的提问来源于stack exchange,提问作者loki
相关产品推荐
相关产品推荐

