Python 3中如何将文本文件读取为含列表嵌套元组的嵌套字典
问题描述
尝试将文本文件读取为嵌套字典,字典中每个字母对应的值是包含元组的列表,但运行代码后字典值全为None,请求解决。
文本文件内容
1976,A,001,58906,98257,002,66288,90069,003,106935,0,004,141490,34531,005,113553,0,006,69384,92113,007,110496,0 1976,B,000,34194,83722 1976,C,001,68404,96397,002,106054,71765,003,88854,79162,004,92435,93154 1976,D,001,116217,52565,002,144780,22819,003,0,1,004,1,0 1976,E,001,160477,56539,002,88829,121290,003,139779,52075,004,75844,75193,005,103746,64008,006,86493,35359,007,147064,45863,008,122342,68374,009,116398,44607,010,111992,38088,011,107618,62435,012,61526,130332,013,135291,63130,014,123285,46674,015,92735,35700,016,104545,91160,017,103898,54270,018,56683,101658,019,68722,124201,020,71193,146158,021,101837,44094,022,68543,114769,023,130619,86434,024,108296,51478,025,57966,17737,026,59093,112619,027,94988,114623,028,114612,28303,029,82515,10852,030,82767,28503,031,83155,0,032,92034,35394,033,77807,95398,034,100988,98147,035,87472,76765,036,90830,49368,037,49021,133634,038,103317,59092,039,86745,122657,040,102132,148512,041,94590,128784,042,103062,32565,043,93475,173576 .... and so on..
期望输出
{ '1976': {'A': [("001", 58906, 98257), ("002", 66288, 90069), ("003", 106935, 0), ("004", 141490, 34531), ("005", 113553, 0), ("006", 69384, 92113), ("007", 110496, 0)], 'B': [("000", 34194, 83722)], 'C': [("001", 68404, 96397), ("002", 106054, 71765), ("003", 88854, 79162), ("004", 92435, 93154)], ...etc }
当前代码
import csv results = {} with open("file.txt", 'r') as f: for line in f: list = line.split(",") year= str.strip(list[0]) letter=str.strip(list[1]) for x in range(2, (len(list))): value= str.strip(list[x]) if year not in results: results.update({year: {letter: value}}) elif state not in results[year].keys(): results[year].update({letter:value}) else: results[year][letter]=[].append(value) print(results)
实际输出
{'1976': {'A': None, 'B': None, 'C': None...} and so on
问题分析与解决
错误原因
list.append()返回None:代码中results[year][letter]=[].append(value)这行,append()方法是在原列表上修改,返回值为None,直接赋值会导致存储None。- 遍历逻辑错误:逐个遍历索引2开始的元素,无法将每3个元素正确组成一个元组。
- 变量名错误:代码中使用了未定义的
state变量,实际应该用letter。 - 初始化错误:首次赋值时直接将单个值绑定到字母键,而非初始化列表,后续无法正确追加元素。
修正后的代码
results = {} with open("file.txt", 'r') as f: for line in f: parts = line.strip().split(",") # 先去除换行符再分割 year = parts[0].strip() letter = parts[1].strip() tuples_list = [] # 每3个元素为一组,生成元组 for i in range(2, len(parts), 3): # 避免行尾空元素导致越界 if i + 2 < len(parts): num = parts[i].strip() val1 = int(parts[i+1].strip()) val2 = int(parts[i+2].strip()) tuples_list.append((num, val1, val2)) # 更新嵌套字典 if year not in results: results[year] = {} results[year][letter] = tuples_list print(results)
代码说明
- 正确分组元素:使用步长为3的循环,将每3个元素组成一个元组,匹配期望的结构。
- 层级初始化:先检查年份是否存在于结果字典,不存在则创建空字典,再将元组列表赋值给对应字母键。
- 类型转换:将数值部分转为整数,若需保留字符串可移除
int()。 - 避免
None赋值:直接生成完整的元组列表再赋值,不使用append()的返回值。
内容的提问来源于stack exchange,提问作者degeneratematter
相关产品推荐
相关产品推荐

