You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:07