Python列表首元素匹配:按索引奇偶统计符合条件的对数
问题解决:统计符合规则的首数位数字对
我来帮你搞定这个问题!先梳理下你原代码里的几个问题,再给你一个简洁高效的解决方案:
原代码的问题点
- 重复计数:嵌套循环中
i和j的范围会导致同一对数字被统计两次(比如i=0,j=2和i=2,j=0都会触发计数),结果会翻倍 - 条件判断语法错误:
(i,j%2==0 or i,j%2==1)写法不符合Python语法,正确的判断应该是i % 2 == j % 2(确保两个索引同奇偶) - 未处理最大对数限制:没有实现“同一首数位最多只能组成2对”的规则
- 冗余操作:不需要将字符串拆分为子列表,直接取每个字符串的第一个字符即可完成判断
简洁解决方案
核心思路是:先按索引奇偶性拆分两组,分别统计每组内首数位的出现次数,再根据规则计算每组的有效对数,最后求和。
代码实现
test_list = ['58','12','50','17'] pair = 0 # 将原列表按索引奇偶性拆分为两组 even_index_group = [s[0] for idx, s in enumerate(test_list) if idx % 2 == 0] odd_index_group = [s[0] for idx, s in enumerate(test_list) if idx % 2 == 1] # 定义函数计算单组内的有效对数 def calculate_valid_pairs(group): from collections import Counter digit_counts = Counter(group) group_pairs = 0 for digit, count in digit_counts.items(): # 计算该数位能组成的对数,最多取2对 possible_pairs = count * (count - 1) // 2 # n个元素的组合数公式 group_pairs += min(possible_pairs, 2) return group_pairs # 累加两组的有效对数 pair += calculate_valid_pairs(even_index_group) pair += calculate_valid_pairs(odd_index_group) print(pair) # 输出结果:2
代码说明
- 分组处理:使用
enumerate获取每个元素的索引,将偶数索引和奇数索引的元素拆分到两个独立组,确保只统计同奇偶索引的数字对 - 计数统计:用
collections.Counter快速统计每组内每个首数位的出现次数 - 规则适配:对每个数位的出现次数,先计算理论上能组成的对数(组合数公式),再取该值与2的最小值,满足“同一首数位最多2对”的限制
- 结果求和:将两组的有效对数相加,得到最终的
pair值
内容的提问来源于stack exchange,提问作者Safiya Hamid
相关产品推荐
相关产品推荐

