如何检查列表中是否存在至少5个指定格式的元素?
问题描述
需要检查列表中是否至少有5个符合正则格式r"P\d+:Q\d+"的元素(例如P14:Q52、P32:Q65这类)。现有单元格范围列表:
mcr_coord_lst = [mcr.coord for mcr in worksheet.merged_cells.ranges] # 列表示例: # ['P58239:Q58239', # 'P58234:Q58234', # ... # 'A123:Q324234', # ... # ]
尝试用计数器结合正则统计,但代码持续输出Yes,现有代码:
counter = 0 is_in = False while is_in == False: for item in mcr_coord_lst: if pq_columns.match(item): counter += 1 if counter >= 5: print('Yes') is_in = True else: print('No') break
需要修复该代码,或推荐其他实现方法。
问题分析与修复
原代码的核心问题:
- 外层
while循环会重复遍历列表,计数器无重置逻辑,达标后会持续触发打印; - 内层
for循环的else分支,遇到第一个不符合格式的元素就终止遍历,无法统计全部符合条件的元素。
修复后的代码
import re pq_columns = re.compile(r"P\d+:Q\d+") counter = 0 for item in mcr_coord_lst: if pq_columns.match(item): counter += 1 # 达标后直接打印并终止遍历,无需继续统计 if counter >= 5: print('Yes') break # 遍历结束后若计数器未达标,打印No else: print('No')
更简洁的实现方法
方法1:生成器表达式统计总数
直接统计所有符合条件的元素数量,再判断是否达标:
import re pq_columns = re.compile(r"P\d+:Q\d+") match_count = sum(1 for item in mcr_coord_lst if pq_columns.match(item)) print('Yes' if match_count >=5 else 'No')
方法2:提前终止遍历(大列表更高效)
无需统计全部元素,找到第5个符合条件的元素就停止遍历:
import re from itertools import islice pq_columns = re.compile(r"P\d+:Q\d+") # 生成符合条件的元素迭代器,只取前5个 qualified_items = islice((item for item in mcr_coord_lst if pq_columns.match(item)), 5) # 判断是否取到了至少5个元素 print('Yes' if len(list(qualified_items)) >=5 else 'No')
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

