从列表中删除无序重复的子列表

2 投票
2 回答
800 浏览
提问于 2025-04-16 21:42

我的问题跟下面链接的内容很相似,只不过如果有一个[2,1]的元素,我也希望把它删除。

从列表中删除重复项

我尝试了各种方法,但就是无法解决。任何帮助都非常感谢!

谢谢。

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))

撰写回答