如何统计字典列表中按mne分组的非生产/生产环境应用与代理数量?
问题需求
给定一个字典列表,需按mne字段分组,统计每组的以下数据:
- 非生产环境(dev、uat)与生产环境(prod)下的
appname去重数量(对应字段non_prod_app_count、prod_app_count) - 对应环境下的
agentname总数(对应字段non_prod_agent_count、prod_agent_count)
输入示例
data = [ {"mne": "ABC", "appname": "abc1", "agentname": "abcagent1", "env": "dev"}, {"mne": "ABC", "appname": "abc1", "agentname": "abcagent2", "env": "uat"}, {"mne": "ABC", "appname": "abc1", "agentname": "abcagent3", "env": "prod"}, {"mne": "ABC", "appname": "abc2", "agentname": "abcagent4", "env": "dev"}, {"mne": "ABC", "appname": "abc2", "agentname": "abcagent5", "env": "prod"}, {"mne": "XYZ", "appname": "asf1", "agentname": "asfagent1", "env": "dev"}, {"mne": "XYZ", "appname": "asf2", "agentname": "asfagent2", "env": "prod"}, ]
期望输出示例
[ {"mne": "ABC", "non_prod_app_count": 2, "prod_app_count": 2, "non_prod_agent_count": 3, "prod_agent_count": 2}, {"mne": "XYZ", "non_prod_app_count": 1, "prod_app_count": 1, "non_prod_agent_count": 1, "prod_agent_count": 1} ]
统计规则说明
- 非生产环境(non_prod)包含:dev、uat
- 生产环境(prod)包含:prod
以输出中第一个字典为例:
non_prod_app_count = 2(对应去重后的appname:abc1、abc2)prod_app_count = 2(对应去重后的appname:abc1、abc2)non_prod_agent_count = 3(对应所有non_prod环境下的agentname总数:abcagent1、abcagent2、abcagent4)prod_agent_count = 2(对应所有prod环境下的agentname总数:abcagent3、abcagent5)
实现代码
用Python字典分组统计,逻辑清晰高效:
def calculate_stats(data): stats = {} for item in data: mne = item["mne"] appname = item["appname"] agentname = item["agentname"] env = item["env"] if mne not in stats: stats[mne] = { "mne": mne, "non_prod_apps": set(), "prod_apps": set(), "non_prod_agent_count": 0, "prod_agent_count": 0 } current = stats[mne] if env in ("dev", "uat"): current["non_prod_apps"].add(appname) current["non_prod_agent_count"] += 1 elif env == "prod": current["prod_apps"].add(appname) current["prod_agent_count"] += 1 result = [] for mne_data in stats.values(): result.append({ "mne": mne_data["mne"], "non_prod_app_count": len(mne_data["non_prod_apps"]), "prod_app_count": len(mne_data["prod_apps"]), "non_prod_agent_count": mne_data["non_prod_agent_count"], "prod_agent_count": mne_data["prod_agent_count"] }) return result # 测试执行 data = [ {"mne": "ABC", "appname": "abc1", "agentname": "abcagent1", "env": "dev"}, {"mne": "ABC", "appname": "abc1", "agentname": "abcagent2", "env": "uat"}, {"mne": "ABC", "appname": "abc1", "agentname": "abcagent3", "env": "prod"}, {"mne": "ABC", "appname": "abc2", "agentname": "abcagent4", "env": "dev"}, {"mne": "ABC", "appname": "abc2", "agentname": "abcagent5", "env": "prod"}, {"mne": "XYZ", "appname": "asf1", "agentname": "asfagent1", "env": "dev"}, {"mne": "XYZ", "appname": "asf2", "agentname": "asfagent2", "env": "prod"}, ] print(calculate_stats(data))
代码说明
- 遍历输入列表,按
mne分组,用集合存储不同环境下的appname(自动实现去重),用计数器统计agentname总数。 - 遍历完成后,将集合长度转换为最终的
app_count字段,整理成期望的输出格式。 - 利用集合特性自动处理
appname重复值,无需额外去重逻辑。
内容的提问来源于stack exchange,提问作者gvk
相关产品推荐
相关产品推荐

