如何合并多个正则表达式的生成结果并实现去重排序?
解决多个exrex生成器去重并排序的问题
没问题,这事儿很容易搞定!你想要的简洁实现方式,不管是用集合推导式还是借助itertools,都能一行代码完成需求。
核心思路
你手里的expansions是个包含多个生成器的map对象,没法直接转集合去重——得先把每个生成器里的元素都取出来,再统一去重,最后排序。
方案1:集合推导式(最直观)
直接用两层循环的集合推导式,一次性完成“遍历所有生成器→取出所有元素→自动去重”,最后排序:
from exrex import generate my_regexs = ('a|b', 'a|c') # 一行搞定去重+排序 sorted_list = sorted({item for gen in map(generate, my_regexs) for item in gen}) print(sorted_list) # 输出: ['a', 'b', 'c']
拆解下逻辑:
map(generate, my_regexs):给每个正则表达式生成对应的迭代器(生成器)- 外层
for gen in ...:遍历每个生成器 - 内层
for item in gen:取出每个生成器里的所有结果项 - 大括号
{}:把所有项放进集合,自动剔除重复的'a' sorted():把无序的集合转换成你需要的有序列表
方案2:用itertools.chain扁平化迭代器
如果你习惯用itertools的工具,也可以用chain.from_iterable把多个生成器扁平化成一个迭代器,再转集合去重:
from exrex import generate from itertools import chain my_regexs = ('a|b', 'a|c') sorted_list = sorted(set(chain.from_iterable(map(generate, my_regexs)))) print(sorted_list) # 输出同样是: ['a', 'b', 'c']
这个思路更偏向“先把所有迭代器合并成一个,再统一处理”,效果和方案1完全一致。
关于中间变量的选择
如果你不需要保留expansions这个中间对象,直接把map(generate, my_regexs)放进推导式/chain里就行,不用额外定义变量——完全符合你要的简洁性。
内容的提问来源于stack exchange,提问作者Michael Goldshteyn
相关产品推荐
相关产品推荐

