如何在Python中从列表中删除重复数组

5

我在 Python 中有一个填充了数组的列表。

([4,1,2],[1,2,3],[4,1,2])

如何去除重复的数组?


那将是一个填充有列表的元组。 - Explosion Pills
4个回答

4

如果您可以将内容转换为元组/其他可哈希项,并且使用集合作为中间元素,则可以非常简单地删除重复项。

lst = ([4,1,2],[1,2,3],[4,1,2])
# convert to tuples
tupled_lst = set(map(tuple, lst))
lst = map(list, tupled_lst)

如果您需要保持顺序或不想转换为元组,可以使用集合来检查是否之前已经看到过该项,然后进行迭代,即:

seen = set()
def unique_generator(lst)
    for item in lst:
       tupled = tuple(item)
       if tupled not in seen:
           seen.add(tupled)
           yield item
lst = list(unique_generator(lst))

这并不是优秀的Python代码,但你也可以使用疯狂的列表推导式来编写它 :)
seen = set()
lst = [item for item in lst if not(tuple(item) in seen or seen.add(tuple(item)))]

2
如果顺序很重要:

>>> from collections import OrderedDict
>>> items = ([4,1,2],[1,2,3],[4,1,2])
>>> OrderedDict((tuple(x), x) for x in items).values()
[[4, 1, 2], [1, 2, 3]]

否则,这就简单得多:
>>> set(map(tuple, items))
set([(4, 1, 2), (1, 2, 3)])

1
l = ([4,1,2],[1,2,3],[4,1,2])
uniq = []
for i in l:
    if not i in uniq:
        uniq.append(i)
print('l=%s' % str(l))
print('uniq=%s' % str(uniq))

产生的结果为:

l=([4, 1, 2], [1, 2, 3], [4, 1, 2])
uniq=[[4, 1, 2], [1, 2, 3]]

这对我来说更合乎逻辑 :) - Yank

0

使用集合来跟踪已经出现的项,但是由于集合只能包含可哈希的项,因此您可能需要先将元组的项转换为某些可哈希的值(在这种情况下为元组)。

集合提供O(1)的查找,因此总体复杂度将是O(N)

此生成器函数将保留顺序:

def solve(lis):
    seen = set()
    for x in lis:
        if tuple(x) not in seen:
            yield x
            seen.add(tuple(x))

>>> tuple( solve(([4,1,2],[1,2,3],[4,1,2])) )
([4, 1, 2], [1, 2, 3])

如果顺序不重要,那么你可以在这里简单地使用 set()
>>> lis = ([4,1,2],[1,2,3],[4,1,2]) # this contains mutable/unhashable items 
>>> set( tuple(x) for x in lis)    # apply tuple() to each item, to make them hashable
set([(4, 1, 2), (1, 2, 3)])  # sets don't preserve order

>>> lis = [1, 2, 2, 4, 1]    #list with immutable/hashable items
>>> set(lis)
set([1, 2, 4])

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