Python Comprehensions取列表重复元素转set后转列表顺序为何改变
顺序变化的核心原因
- Python 中的
set是无序的哈希表结构,设计上就不记录、不保留元素的插入顺序,元素在集合内的存储位置由元素的哈希值、哈希表的当前填充状态共同决定,和元素在原列表中的出现顺序没有关联。 - 你通过列表推导得到的临时列表内容为
['d', 'd', 'e', 'e'],转set后内部的元素排序规则和原列表完全无关,后续调用list()转换时会直接读取set内部的存储顺序生成列表,所以最终结果顺序和你预期的原列表出现顺序不一致。
保留顺序的实现方案
如果需要保留重复元素在原列表中的首次出现顺序,可参考以下两种实现:
- 适配Python3.7+版本(原生字典默认保序)
lis = ['a', 'b', 'c', 'd', 'd', 'e', 'e'] duplicates = list(dict.fromkeys([x for x in lis if lis.count(x) > 1]).keys()) # 输出结果为 ['d', 'e'],和原列表出现顺序一致
如果需要兼容Python3.7以下版本,替换dict为collections.OrderedDict即可。
- 大列表优化方案(仅遍历1次列表,效率更高)
from collections import Counter lis = ['a', 'b', 'c', 'd', 'd', 'e', 'e'] count_map = Counter(lis) duplicates = [k for k, v in count_map.items() if v > 1]
内容的提问来源于stack exchange,提问作者Rag12
相关产品推荐
相关产品推荐

