如何用for/while循环处理Python二维数组统计候选人偏好票数?
用循环统计偏好选票的实现方案
没问题,我来帮你搞定这个用循环统计候选人偏好票的需求。我们可以先初始化统计变量,再通过嵌套循环遍历选票数组,下面分for循环和while循环两种方式实现,还会给你一个优化方案:
一、使用嵌套For循环(最常用的方式)
这种方式逻辑直观,是Python处理二维列表的常规操作:
# 初始化所有统计变量:candidateNvoteM 代表候选人N的第M偏好票数 candidate1vote1 = 0 candidate1vote2 = 0 candidate1vote3 = 0 candidate2vote1 = 0 candidate2vote2 = 0 candidate2vote3 = 0 candidate3vote1 = 0 candidate3vote2 = 0 candidate3vote3 = 0 candidate4vote1 = 0 candidate4vote2 = 0 candidate4vote3 = 0 candidate5vote1 = 0 candidate5vote2 = 0 candidate5vote3 = 0 # 示例 ballots 数组(你可以替换成自己的实际数据) ballots = [ [1, 2, 3, 0, 0], [1, 3, 2, 0, 0], [2, 1, 3, 0, 0] ] # 遍历每一张选票 for ballot in ballots: # 遍历当前选票的每个位置,用enumerate同时获取索引(对应候选人)和偏好值 for candidate_index, preference in enumerate(ballot): # 忽略0值 if preference == 0: continue # 把索引转成候选人编号(索引0对应候选人1,以此类推) candidate_num = candidate_index + 1 # 偏好值1/2/3就是第1/2/3偏好票 vote_rank = preference # 根据候选人编号和偏好等级累加对应变量 if candidate_num == 1: if vote_rank == 1: candidate1vote1 += 1 elif vote_rank == 2: candidate1vote2 += 1 else: candidate1vote3 += 1 elif candidate_num == 2: if vote_rank == 1: candidate2vote1 += 1 elif vote_rank == 2: candidate2vote2 += 1 else: candidate2vote3 += 1 elif candidate_num == 3: if vote_rank == 1: candidate3vote1 += 1 elif vote_rank == 2: candidate3vote2 += 1 else: candidate3vote3 += 1 elif candidate_num == 4: if vote_rank == 1: candidate4vote1 += 1 elif vote_rank == 2: candidate4vote2 += 1 else: candidate4vote3 += 1 elif candidate_num == 5: if vote_rank == 1: candidate5vote1 += 1 elif vote_rank == 2: candidate5vote2 += 1 else: candidate5vote3 += 1 # 打印结果验证 print(f"候选人1的第1偏好票:{candidate1vote1}") print(f"候选人2的第2偏好票:{candidate2vote2}") print(f"候选人3的第2偏好票:{candidate3vote2}")
代码说明:
- 先初始化所有15个统计变量(5个候选人×3种偏好)。
- 外层
for循环遍历每一张选票(每个子列表)。 - 内层用
enumerate遍历选票元素,同时拿到位置索引(对应候选人1-5)和偏好值。 - 跳过0值后,根据候选人编号和偏好等级,找到对应的变量累加计数。
二、使用While循环实现
如果必须用while循环,逻辑和for循环一致,只是用索引来控制遍历流程:
# 同样初始化统计变量 candidate1vote1 = 0 candidate1vote2 = 0 candidate1vote3 = 0 candidate2vote1 = 0 candidate2vote2 = 0 candidate2vote3 = 0 candidate3vote1 = 0 candidate3vote2 = 0 candidate3vote3 = 0 candidate4vote1 = 0 candidate4vote2 = 0 candidate4vote3 = 0 candidate5vote1 = 0 candidate5vote2 = 0 candidate5vote3 = 0 ballots = [ [1, 2, 3, 0, 0], [1, 3, 2, 0, 0], [2, 1, 3, 0, 0] ] # 外层while循环:遍历所有选票 ballot_index = 0 while ballot_index < len(ballots): current_ballot = ballots[ballot_index] # 内层while循环:遍历当前选票的每个元素 pref_index = 0 while pref_index < len(current_ballot): preference = current_ballot[pref_index] if preference == 0: pref_index += 1 continue candidate_num = pref_index + 1 vote_rank = preference # 同样的条件判断累加计数 if candidate_num == 1: if vote_rank == 1: candidate1vote1 +=1 elif vote_rank ==2: candidate1vote2 +=1 else: candidate1vote3 +=1 elif candidate_num == 2: if vote_rank ==1: candidate2vote1 +=1 elif vote_rank ==2: candidate2vote2 +=1 else: candidate2vote3 +=1 elif candidate_num ==3: if vote_rank ==1: candidate3vote1 +=1 elif vote_rank ==2: candidate3vote2 +=1 else: candidate3vote3 +=1 elif candidate_num ==4: if vote_rank ==1: candidate4vote1 +=1 elif vote_rank ==2: candidate4vote2 +=1 else: candidate4vote3 +=1 elif candidate_num ==5: if vote_rank ==1: candidate5vote1 +=1 elif vote_rank ==2: candidate5vote2 +=1 else: candidate5vote3 +=1 pref_index += 1 ballot_index += 1 # 验证结果 print(f"候选人1的第1偏好票:{candidate1vote1}") print(f"候选人3的第2偏好票:{candidate3vote2}")
三、优化方案:用二维列表简化统计
用单独变量统计会显得繁琐,推荐用二维列表来存储统计结果,代码更简洁易维护:
# 二维列表:stats[候选人编号-1][偏好等级-1] 对应票数 # 比如 stats[0][0] 是候选人1的第1偏好票,stats[1][1]是候选人2的第2偏好票 stats = [[0]*3 for _ in range(5)] ballots = [ [1, 2, 3, 0, 0], [1, 3, 2, 0, 0], [2, 1, 3, 0, 0] ] for ballot in ballots: for idx, pref in enumerate(ballot): if pref == 0: continue # 直接定位到对应位置累加 stats[idx][pref-1] += 1 # 打印结果 print(f"候选人1的第1偏好票:{stats[0][0]}") print(f"候选人2的第2偏好票:{stats[1][1]}") print(f"候选人3的第2偏好票:{stats[2][1]}")
内容的提问来源于stack exchange,提问作者SlaveToSociety
相关产品推荐
相关产品推荐

