从列表中删除无序重复的子列表
2 个回答
1
这个方法可以用,但它不能保持子列表的顺序:
def bygroup(k):
k = sorted(sorted(x) for x in k)
return [k for k,_ in itertools.groupby(k)]
>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [2, 1]]
>>> bygroup(k)
[[1, 2], [2, 5, 6], [3], [4]]
在Python 2.7或3.2中,如果你想保持子列表的顺序以及整个列表的一般顺序(除了重复的项),你可以使用OrderedDict,不过它的速度会慢很多:
def bydict(k):
s = collections.OrderedDict()
for i in k:
s[tuple(sorted(i))] = i
return s.values()
>>> bydict(k)
[[2, 1], [4], [5, 6, 2], [3]]
我用timeit测试了100,000次。发现使用bydict函数在Python 2.7.2中大约慢了4倍,在Python 3.2中大约慢了3倍。
0
也许你真正想要的是一个“集合的集合”。
unique = set(map(set, list_of_lists))
补充:不过,这样做不行。因为集合不能包含集合,因为集合是不可哈希的。不过,frozenset
是可以的:
unique = set(map(frozenset, list_of_lists))