如何统计文本文件中列表各列数字的出现次数并按要求输出?
解决按列统计数字出现次数的问题
问题描述
我有一个txt文件,内容如下:
[1, 2, 1] [2, 1, 3] [3, 2, 3]
想要分别统计每一列中数字1、2、3的出现次数,并按如下格式输出结果:
- Column
1 Result : 1
2 Result : 1
3 Result : 1
- Column
1 Result : 1
2 Result : 2
3 Result : 0
但尝试了多种循环写法未能实现,我的Python代码如下:
from ast import literal_eval count = 0 first = 0 second = 0 third = 0 with open("data.txt") as f: matrix = [] for line in f: row = literal_eval(line) matrix.append(row) print(matrix) print(len(matrix)) print("-----------") for i in matrix: for j in range(3): if i[j] == 1: first += 1 elif i[j] == 2: second += 1 elif i[j] == 3: third += 1 print(f"1. Result {first}") print(f"2. Result {second}") print(f"3. Result {third}") print(f"----")
代码问题分析
你的代码目前是按行累加统计所有元素的总数,没有实现按列统计的核心逻辑:
- 每次循环行时,会把当前行的三个列元素都加到同一个计数器里,导致统计的是从第一行到当前行的所有1、2、3的总数,而非单列数据。
- 没有对每一列单独初始化计数器,也没有按列维度去遍历数据。
解决方案
要实现按列统计,首先需要把矩阵转置(行变列),这样每一个子列表就对应原矩阵的一列。然后对每一列单独统计1、2、3的出现次数,最后按要求格式输出。
修改后的代码如下:
from ast import literal_eval # 读取文件构建矩阵 with open("data.txt") as f: matrix = [literal_eval(line.strip()) for line in f] # 转置矩阵:行变列,每个元组对应原矩阵的一列 transposed = list(zip(*matrix)) # 遍历每一列,统计数字出现次数 for col_idx, column in enumerate(transposed, start=1): # 直接统计当前列中各数字的出现次数 count_1 = column.count(1) count_2 = column.count(2) count_3 = column.count(3) # 按要求格式输出 print(f"{col_idx}. Column") print(f"1 Result : {count_1}") print(f"2 Result : {count_2}") print(f"3 Result : {count_3}") # 除最后一列外,打印分隔线 if col_idx != len(transposed): print("---")
代码说明
- 转置矩阵:
zip(*matrix)可以快速将原矩阵的行转换为列,比如原矩阵[[1,2,1],[2,1,3],[3,2,3]]转置后得到[(1,2,3), (2,1,2), (1,3,3)],每个元组对应原矩阵的一列。 - 统计次数:利用元组的
count()方法直接统计当前列中1、2、3的出现次数,简洁高效。 - 格式输出:通过
enumerate获取列的索引(从1开始),按要求格式打印每列的统计结果,最后一列不打印分隔线。
运行这段代码后,就能得到你想要的输出效果。
内容的提问来源于stack exchange,提问作者onurhanozer
相关产品推荐
相关产品推荐

