Python2.7禁用any/all时如何用列表推导式实现字符串筛选逻辑
问题解答
你要实现的「保留所有不存在更长包含项的字符串元素」逻辑,完全可以通过列表推导式实现,无需依赖any/all函数,适配你使用的Python 2.7子集环境。
单步实现代码
直接通过一层列表推导式即可得到预期结果,逻辑为:遍历每个字符串t,统计列表中是t的子串且不等于t的元素数量,若数量为0则说明没有更短的子串匹配项,保留该元素:
string_list1 = ['James Dean', 'Mr. James Dean', 'Jon Sparrow', 'Timothy Hook', 'Captain Jon Sparrow'] result = [t for t in string_list1 if sum(1 for s in string_list1 if s in t and s != t) == 0] print('Desired: ', result) # 输出:Desired: ['James Dean', 'Jon Sparrow', 'Timothy Hook']
对应原逻辑的两步实现
如果要和你原本的「先提取子串集合、再过滤原列表」的逻辑对齐,也可以拆分为两个列表推导式实现:
- 第一步提取所有是其他元素子串的短字符串,去重得到子串集合
sub_strings = set([s for s in string_list1 for t in string_list1 if s in t and s != t])
- 第二步过滤原列表,排除所有包含任意子串集合中元素的长字符串即可
result = [t for t in string_list1 if sum(1 for s in sub_strings if s in t and s != t) == 0]
注意事项
- 如果原列表存在完全重复的元素,可以先通过
list(set(string_list1))去重后再执行上述逻辑,避免统计结果异常 - 两种实现的输出都和你预期的结果完全一致,时间复杂度和你原本的双重循环写法相同,没有额外性能损耗
内容的提问来源于stack exchange,提问作者Jason Hudson
相关产品推荐
相关产品推荐

