如何基于Python字典实现各类线材长度的自动汇总?
自动统计所有线材类型总长度的Python实现
问题背景
我是Python编程新手,正在开发一个统计线材列表中各类线材总长度的程序。目前已实现用户指定线材类型的长度汇总功能,现在需要编写代码自动统计文件中所有线材类型的总长度。
现有指定线材统计代码
wtype = [] w = [] w1 = [] # 打开TXT文件 fhand = input('\nEnter Text File\n') try: if len(fhand) <= 0: fhand = 'test.txt' fh = open(fhand) except: print('\nNo File Found:', fhand, '\n') exit() # 输出所有可能的线材类型 for line in fh: line = line.rstrip() wtype.append(line) # 后续代码需要用到 line2 = line.split(',')[2] if line2 not in w: w.append(line2) else: continue d1 = dict(enumerate(w)) print(d1) # 汇总用户选择的线材类型总长度 wire = int(input('\nEnter the number that is before the wire type you need:\n')) for key, val in d1.items(): if key == wire: for x in wtype: x = x.split(',') if x[2] == val: w1.append(x[1]) else: continue s = [eval(i) for i in w1] print('\nYour will need ', sum(s)/12, ' Feet of ', val, '.\n')
test.txt文件说明
文件中长度单位为英寸,代码通过sum(s)/12转换为英尺,列依次为WIRE、LENGTH、TYPE、QTY,示例数据如下:
WIRE-006A22,72,M22759/16-22-9,1 WIRE-005A22,60,M22759/16-22-9,1 WIRE-004A22,72,M22759/16-22-9,1 WIRE-003A22,72,M22759/16-20-9,1 WIRE-002A22,60,M22759/16-20-9,1 WIRE-001A22,72,M22759/16-22-9,1 WIRE-009A22,72,M22759/16-22-9,1 WIRE-008A22,60,M22759/16-22-9,1 WIRE-007A22,72,M22759/16-20-9,1 WIRE-011A22,72,M22759/16-22-9,1 WIRE-012A22,72,M22759/16-22-9,1 WIRE-014A22,72,M22759/16-20-9,1 WIRE-013A22,60,M22759/16-22-9,1 WIRE-021A22,72,M22759/16-20-9,1 WIRE-031A22,72,M22759/16-22-9,1 WIRE-032A22,72,M22759/16-20-9,1 WIRE-043A22,60,M22759/16-22-9,1 WIRE-054A22,72,M22759/16-20-9,1 WIRE-065A22,72,M22759/16-22-9,1 WIRE-076A22,60,M22759/16-22-9,1 WIRE-087A22,72,M22759/16-22-9,1 WIRE-098A22,72,M22759/16-20-9,1 WIRE-089A22,72,M22759/16-20-9,1 WIRE-078A22,72,M22759/16-20-9,1 WIRE-067A22,60,M22759/16-22-9,1 WIRE-056A22,72,M22759/16-22-9,1 WIRE-045A22,72,M22759/16-20-9,1 WIRE-034A22,60,M22759/16-22-9,1 WIRE-023A22,60,M22759/16-22-9,1 WIRE-012A22,72,M22759/16-20-9,1
期望输出格式
自动统计所有线材类型的总长度(单位:英尺),输出格式如下:
output: {'M22759/16-22-9': 100, 'M22759/16-20-9': 71}
改进后的自动统计代码
# 初始化统计字典,键为线材类型,值为总长度(英寸) wire_lengths = {} # 处理文件输入 fhand = input('\nEnter Text File\n') try: if len(fhand) <= 0: fhand = 'test.txt' with open(fhand, 'r') as fh: for line in fh: line = line.strip() if not line: continue # 跳过空行 # 拆分字段,获取长度和类型 parts = line.split(',') if len(parts) < 3: continue # 跳过格式错误的行 length = int(parts[1]) wire_type = parts[2] # 累加长度 if wire_type in wire_lengths: wire_lengths[wire_type] += length else: wire_lengths[wire_type] = length except FileNotFoundError: print(f'\nNo File Found: {fhand}\n') exit() # 转换为英尺并格式化输出(保留整数或按需调整精度) result = {k: round(v / 12) for k, v in wire_lengths.items()} print(f'output: {result}')
代码说明
- 统计字典初始化:用
wire_lengths字典直接存储每个线材类型的总长度,无需先收集所有类型再二次遍历,更高效。 - 文件读取优化:使用
with语句自动管理文件资源,避免手动关闭文件的疏漏。 - 数据处理:遍历每行数据时直接拆分字段,将长度转换为整数后累加至对应类型的字典值中,同时跳过空行和格式错误的行。
- 单位转换:最后将总英寸数除以12转换为英尺,用
round()取整,和示例输出格式一致。
内容的提问来源于stack exchange,提问作者wortzinator
相关产品推荐
相关产品推荐

