如何使用Python itertools实现嵌套列表矩阵的缩放操作?
基于itertools的二维条码矩阵缩放实现
你当前的嵌套列表推导式实现逻辑通顺,用itertools改写可以获得更简洁的核心逻辑,同时大矩阵场景下的执行效率也会更高。
你之前写的itertools版本只实现了行维度的重复,缺失了单行内元素按倍率复制的步骤,补上这层处理就能完成完整的宽高同步缩放。
核心缩放逻辑(无填充)
仅实现按整数缩放因子重复行与行内元素的核心逻辑,代码如下:
import itertools def scale_matrix(matrix, scaling_factor): # 先生成宽度缩放后的行:每个元素重复scaling_factor次 width_scaled_rows = ( list(itertools.chain.from_iterable(itertools.repeat(cell, scaling_factor) for cell in row)) for row in matrix ) # 再做高度缩放:每个宽度缩放后的行重复scaling_factor次 return list(itertools.chain.from_iterable(itertools.repeat(row, scaling_factor) for row in width_scaled_rows))
这段代码的执行效果和嵌套列表推导式的纯缩放逻辑完全一致:比如输入[[1,0],[0,1]]、缩放因子为2,会输出[[1,1,0,0],[1,1,0,0],[0,0,1,1],[0,0,1,1]]。
带居中填充的完整实现
和你现有代码的填充逻辑对齐,支持缩放后补填充位到目标宽高、内容居中:
def resize_barcode_matrix(matrix, target_width, target_height, scaling_factor, padding_char=0): # 先完成核心缩放 core_matrix = scale_matrix(matrix, scaling_factor) core_height = len(core_matrix) core_width = len(core_matrix[0]) if core_height else 0 # 计算各方向填充长度,和原有逻辑保持一致:单侧向下/向右取整 pad_vertical = target_height - core_height pad_top = pad_vertical // 2 pad_bottom = pad_vertical - pad_top pad_horizontal = target_width - core_width pad_left = pad_horizontal // 2 pad_right = pad_horizontal - pad_left # 拼接顶部填充、带左右填充的核心内容、底部填充 top_padding = ([padding_char] * target_width for _ in range(pad_top)) bottom_padding = ([padding_char] * target_width for _ in range(pad_bottom)) core_with_h_pad = ( [padding_char] * pad_left + row + [padding_char] * pad_right for row in core_matrix ) return list(itertools.chain(top_padding, core_with_h_pad, bottom_padding))
实现说明
- 中间过程全部使用生成器处理,不会额外生成冗余的中间列表,大尺寸条码处理时内存占用更低
- 核心的重复逻辑全部调用itertools的C层实现,同等数据量下比纯Python嵌套列表推导式执行速度更快
- 填充规则和你现有代码完全兼容,不需要调整原有业务的对齐逻辑
如果需要保留独立的expand_height、expand_width函数结构,只需要把对应维度的重复、填充逻辑拆分即可,行内元素重复的部分就是宽度扩展的核心逻辑。
内容的提问来源于stack exchange,提问作者ErikV
相关产品推荐
相关产品推荐

