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

如何用简洁高效的Python代码统计字典列表各键的非X元素次数并校验?

高效统计问卷有效回答数的Python实现

问题背景

给定一个字典列表,每个字典的键代表问题编码,对应的值为1-7的评分或表示未作答的"X"。示例数据如下:

responses = [
    {"a":1,"b":2,"c":"X"},
    {"a":1,"b":"X","c":3},
    {"a":1,"b":2,"c":"X"}
]

需要完成两个目标:

  1. 统计每个问题的有效回答数(即值不等于"X"的次数)
  2. 检查是否存在有效数小于5或大于50的问题
    要求代码简洁高效,需重复执行数千次,对性能有一定要求。

解决方案

纯Python高效实现(轻量场景首选)

使用collections.defaultdict减少键存在性判断,结合嵌套循环完成统计,内置方法的迭代效率远高于手动多层循环:

from collections import defaultdict

def count_valid_responses(responses):
    valid_counts = defaultdict(int)
    # 遍历所有回答,累计有效次数
    for resp in responses:
        for question, answer in resp.items():
            if answer != "X":
                valid_counts[question] += 1
    # 筛选不符合数量要求的问题
    invalid_questions = [q for q, cnt in valid_counts.items() if cnt < 5 or cnt > 50]
    return valid_counts, invalid_questions

# 调用示例
counts, invalid = count_valid_responses(responses)
print("有效回答统计:", counts)  # 输出: {'a': 3, 'b': 2, 'c': 1}
print("异常问题列表:", invalid)  # 输出: ['a', 'b', 'c']

Pandas向量化实现(大规模数据首选)

如果处理的数据集规模较大,Pandas的向量化操作能大幅提升性能,避免Python级别的循环开销:

import pandas as pd

def count_valid_with_pandas(responses):
    # 转换为DataFrame
    df = pd.DataFrame(responses)
    # 统计每列(问题)非"X"的数量
    valid_counts = df.ne("X").sum(axis=0).to_dict()
    # 筛选异常问题
    invalid_questions = [q for q, cnt in valid_counts.items() if cnt < 5 or cnt > 50]
    return valid_counts, invalid_questions

# 调用示例
counts_pd, invalid_pd = count_valid_with_pandas(responses)
print("Pandas统计结果:", counts_pd)
print("异常问题列表:", invalid_pd)

性能说明

  • 小规模数据(单列表含数百个字典):纯Python方法足够高效,启动开销小
  • 大规模数据(单列表含数千/上万个字典):Pandas的向量化操作性能优势明显,适合重复执行数千次的场景

内容的提问来源于stack exchange,提问作者Introser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:16