Python: 如果顺序相同(包括/不包括),从列表中删除子列表

3
有没有办法从一个列表中删除重复的子列表,即使它们的顺序不同?
因此,我能做一些像这样的事情:
x = [[1,2],[3,4],[5,6],[2,1],[7,8]]

转化为

x = [[1,2],[3,4],[5,6],[7,8]]

有没有itertools函数或带有for循环的函数?谢谢!

你是否需要区分 [1,1,2][1,2,1]?并且你需要保留子列表的初始顺序吗? - DSM
2
此外,返回列表的顺序是否重要? - Burhan Khalid
@DSM 是的,子列表的长度可能会增加。而且,顺序并不重要。 - 5813
@DSM,但是子列表内的顺序很重要,因此[7,8]与[8,7]不同。 - 5813
@DSM 是的,这就是我的意思。如果子列表在列表中的其他位置有匹配的子列表,则应删除其中一个,最好是第二个。但是,对于没有重复项的子列表,它应该保持不变。 - 5813
3个回答

4

这将保留列表和子列表的顺序,包括子列表中可能存在的重复项:

y, s = [], set()
for t in x:
    w = tuple(sorted(t))
    if not w in s:
        y.append(t)
        s.add(w)

如果

x = [[1,2],[3,4],[5,6],[2,1,1],[2,1],[7,8],[4,3],[1,2,1]]

那么y将会是什么:
[[1, 2], [3, 4], [5, 6], [2, 1, 1], [7, 8]]

1
+1:这种方法保留了尽可能多的原始信息(不像我的 OrderedDict 方法),并且似乎满足了OP的要求。 - DSM

1
你可以使用 frozenset
>>> def remove_dups(L):
        return map(list, frozenset(map(frozenset, L)))

>>> x = [[1,2],[3,4],[5,6],[2,1],[7,8]]
>>> remove_dups(x)
[[5, 6], [1, 2], [8, 7], [3, 4]]
>>> 

0

试试这个:

a=[[1,2],[3,4],[5,6],[2,1],[7,8]]
y=[]
for i in a:
        if sorted(i) not in y:
                y.append(i)
print y

输出为

[[1, 2], [3, 4], [5, 6], [7, 8]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接