如何高效提取Python字符串列表中的所有唯一字符?
问题描述
现有输入变量列表如下:
field_list = ['u', 'w', 'uu', 'uv', 'uw']
需要输出列表中出现过的所有唯一字符组成的列表。
原先仅处理u、v、w三类字符的实现代码如下:
indv_fields = [] for field in field_list: if "u" in field: indv_fields.append("u") if "v" in field: indv_fields.append("v") if "w" in field: indv_fields.append("w") indv_fields = list(set(indv_fields)) print(indv_fields)
现在需要扩展逻辑适配未知字符范围的场景,同时尽可能提升效率。比如输入如下列表时,原有代码无法提取到字符T:
field_list = ['u', 'v', 'w', 'T', 'ww']
实现方案
最简写法(无需严格保证输出顺序)
利用集合自动去重的特性,直接遍历所有字段的每个字符存入集合,再转列表即可。时间复杂度为O(N)(N为所有字段的总字符数),是该场景下的最优时间复杂度:
indv_fields = list({char for field in field_list for char in field})
针对测试样例field_list = ['u', 'v', 'w', 'T', 'ww'],运行后输出结果为['u', 'v', 'w', 'T'](顺序随Python版本可能略有差异)。
保证字符首次出现顺序的写法
如果需要输出顺序和字符首次出现的顺序保持一致(Python3.7+版本上述集合写法也会默认保留插入顺序,兼容旧版本可以用如下写法):
seen = set() indv_fields = [] for field in field_list: for char in field: if char not in seen: seen.add(char) indv_fields.append(char)
该写法同样为*O(N)*时间复杂度,仅遍历所有字符一次,无多余运算。
内容的提问来源于stack exchange,提问作者Atharva Sunil Sathe
相关产品推荐
相关产品推荐

