Python使用itertools.groupby无法移除全部重复项,如何解决?
问题分析
itertools.groupby() 只能对连续重复的元素进行分组去重,你的列表里像 [1, 2]、[1, 3] 这类重复项不是连续出现的,所以没法被过滤掉。
解决方法
方法1:先排序再用groupby
先对列表排序让重复项连续,再用groupby去重:
import itertools res=[[], [1], [2], [3], [1, 2], [1, 3], [1, 2], [2, 3], [1, 3], [2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] res.sort() res = [i for i, _ in itertools.groupby(res)] print(res) # 输出:[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
如果需要保持原列表中元素首次出现的顺序,可以用下面的方法。
方法2:利用集合去重(保持首次出现顺序)
因为列表不可直接存入集合,先把每个子列表转成可哈希的元组,去重后再转回列表:
res=[[], [1], [2], [3], [1, 2], [1, 3], [1, 2], [2, 3], [1, 3], [2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] seen = set() new_res = [] for item in res: t = tuple(item) if t not in seen: seen.add(t) new_res.append(item) print(new_res) # 输出:[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
这个方法能保留原列表中元素第一次出现的顺序,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者daleng
相关产品推荐
相关产品推荐

