如何从字典列表生成各Tub可用传感器数量统计列表?
问题:统计每个Tub的可用传感器数量
给定字典列表:
sensors = [{'Index': 0, 'Tub': 0, 'Enable': True}, {'Index': 1, 'Tub': 0, 'Enable': False}, {'Index': 2, 'Tub': 0, 'Enable': True}, {'Index': 0, 'Tub': 1, 'Enable': True}, {'Index': 1, 'Tub': 1, 'Enable': True}, {'Index': 2, 'Tub': 1, 'Enable': True} ]
需要生成列表 AvailableSensorsPerTub = [2, 3],其中索引对应Tub编号,值为该Tub中Enable为True的传感器数量。
用户已完成的尝试:
- 创建Tub编号列表:
# Create a list of tubs tubList = list(set(sensor['Tub'] for sensor in tubLevelSensors))
输出为 [0,1]
- 遍历字典列表输出可用传感器信息:
for tub in tubList: for idx in range(len(tubLevelSensors)): if tub == tubLevelSensors[idx]['Tub'] and tubLevelSensors[idx]['Enable'] == True: print(tubLevelSensors[idx]['Tub'], tubLevelSensors[idx]['Index']) print()
得到输出:
0 0 0 2 1 0 1 1 1 2
但无法进一步得到最终结果 [2,3]。
解决方案
方法1:基于现有逻辑改进
在遍历过程中维护计数器,统计每个Tub的可用传感器数,最后按Tub编号顺序整理成列表:
sensors = [{'Index': 0, 'Tub': 0, 'Enable': True}, {'Index': 1, 'Tub': 0, 'Enable': False}, {'Index': 2, 'Tub': 0, 'Enable': True}, {'Index': 0, 'Tub': 1, 'Enable': True}, {'Index': 1, 'Tub': 1, 'Enable': True}, {'Index': 2, 'Tub': 1, 'Enable': True} ] # 获取所有Tub编号并排序(避免set返回的无序性) tub_list = sorted({sensor['Tub'] for sensor in sensors}) available_counts = [] for tub in tub_list: count = 0 # 直接遍历传感器列表,无需通过索引访问 for sensor in sensors: if sensor['Tub'] == tub and sensor['Enable']: count += 1 available_counts.append(count) print(available_counts) # 输出: [2, 3]
方法2:用普通字典高效统计
先通过字典记录每个Tub的可用传感器数量,再按Tub编号排序提取值:
count_dict = {} for sensor in sensors: tub_num = sensor['Tub'] if sensor['Enable']: # 若字典中无该Tub则默认计数0,再加1 count_dict[tub_num] = count_dict.get(tub_num, 0) + 1 # 按Tub编号排序后生成结果列表 available_counts = [count_dict[tub] for tub in sorted(count_dict.keys())] print(available_counts) # 输出: [2, 3]
方法3:使用collections.defaultdict简化统计
借助defaultdict自动处理默认值,减少代码量:
from collections import defaultdict count_dict = defaultdict(int) for sensor in sensors: if sensor['Enable']: count_dict[sensor['Tub']] += 1 available_counts = [count_dict[tub] for tub in sorted(count_dict.keys())] print(available_counts) # 输出: [2, 3]
方法4:一行列表推导式(适合Tub编号连续的场景)
如果已知Tub编号是从0开始的连续整数,可以直接按编号范围统计:
max_tub = max(sensor['Tub'] for sensor in sensors) available_counts = [sum(1 for s in sensors if s['Tub'] == tub and s['Enable']) for tub in range(max_tub + 1)] print(available_counts) # 输出: [2, 3]
内容的提问来源于stack exchange,提问作者iacisme
相关产品推荐
相关产品推荐

