我有一个这样的列表列表
[[], [1, 2, 2], [1], [2], [2], [1, 2], [1, 2], [2, 1], [2, 2]]
Run Code Online (Sandbox Code Playgroud)
我想删除所有重复,这里的顺序并不重要,所以在上面的列表中我需要删除[2],[1,2]和[2,1].我以为我可以这样做Counter()
from collections import Counter
counter_list = []
no_dublicates = []
for sub_list in all_subsets:
counter_dic = Counter(sub_list)
if counter_dic in counter_list:
pass
else:
no_dublicates.append(list(sub_list))
counter_list.append(counter_dic)
Run Code Online (Sandbox Code Playgroud)
哪个工作正常...但它是我的代码中最慢的部分.我想知道是否有更快的方法来做到这一点?
您可以将Counter对象转换为frozensets,这些对象是可以清除的,并且可以放在一个集合中,以便在in检查中进行线性节省:
from collections import Counter
counters = set()
no_duplicates = []
for sub_list in all_subsets:
c = frozenset(Counter(sub_list).items())
if c not in counters:
counters.add(c)
no_duplicates.append(list(sub_list))
Run Code Online (Sandbox Code Playgroud)
用dict理解做这件事看起来也很酷:
no_duplicates = list(
{frozenset(Counter(l).items()): l for l in all_subsets}.values())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |