列表元素前缀筛选问题(仅用循环,禁用第三方库)
问题解决:筛选符合条件的前缀
问题背景
给定列表:
info =['0-0-0-0-0-4-0', '0-0-0-1-0-4-2', '0-0-3-0-0-80-0', '0-0-3-1-0-81-0', '0-0-3-0-0-82-0']
需要筛选出满足以下条件的前缀(元素的前7个字符,如0-0-3-0)对应的元素:
- 该前缀在列表元素中出现至少2次;
- 对应元素的第11-12位数值(如80、82)互不相同。
要求仅用循环实现,不能导入任何库。
用户代码问题
用户编写的代码输出infolist为空,代码如下:
info =['0-0-0-0-0-4-0', '0-0-0-1-0-4-2', '0-0-3-0-0-80-0', '0-0-3-1-0-81-0', '0-0-3-0-0-82-0'] infolist = [] for n in info if info.count(n[0:7]) > 1 if n not in infolist infolist.append(n) end end end Print(infolist)
问题分析
- 语法错误:Python的
for循环、if语句末尾必须加冒号:,而且Python没有end关键字,这段代码根本无法运行,自然输出空列表。 - 逻辑缺失:原代码只判断了前缀出现次数,完全没处理第二个条件——对应数值互不相同的要求;另外用
info.count()每次全列表扫描统计次数,效率也很低。
正确实现代码
info =['0-0-0-0-0-4-0', '0-0-0-1-0-4-2', '0-0-3-0-0-80-0', '0-0-3-1-0-81-0', '0-0-3-0-0-82-0'] # 统计每个前缀的出现次数和对应的数值集合 prefix_stats = {} for item in info: prefix = item[:7] # 提取第11-12位的数值(索引从0开始,对应位置10、11) num = int(item[10:12]) if prefix not in prefix_stats: prefix_stats[prefix] = {'total': 0, 'values': set()} prefix_stats[prefix]['total'] += 1 prefix_stats[prefix]['values'].add(num) # 筛选符合条件的元素 result = [] for item in info: prefix = item[:7] stats = prefix_stats[prefix] # 前缀出现至少2次,且对应的数值不重复(集合长度大于1) if stats['total'] >= 2 and len(stats['values']) > 1: result.append(item) print(result)
代码说明
- 先用字典
prefix_stats统计每个前缀的出现次数,同时用集合存储对应数值(集合自动去重,方便判断数值是否互不相同); - 再次遍历原列表,检查每个元素的前缀是否满足两个条件,满足则加入结果列表;
- 全程只用循环和基础数据结构,没有导入任何库,符合要求。
内容的提问来源于stack exchange,提问作者user289017
相关产品推荐
相关产品推荐

