如果某些重复项不具有相同的顺序,则从列表列表中删除重复项

时间:2011-07-17 14:40:10

标签: python list duplicates

我的问题与下面链接的问题非常相似,只是如果有一个[2,1]元素,我也需要将其删除。

Python: removing duplicates from a list of lists

我尝试了各种各样的东西,但却无法使其发挥作用。任何帮助将非常感激!

感谢。 理查德。

2 个答案:

答案 0 :(得分: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次迭代。在Python 2.7.2中,bydict函数花了大约4倍的时间,在Python 3.2中花了大约3倍。

答案 1 :(得分:1)

也许你真正想要的是{em> set set s

unique = set(map(set, list_of_lists))

编辑:好吧,但这不起作用。唉,集合不能包含集合,因为集合是不可用的。但frozenset是:

unique = set(map(frozenset, list_of_lists))