我在Python中有一个填充数组的列表。
([4,1,2],[1,2,3],[4,1,2])
如何删除重复的数组?
答案 0 :(得分:3)
删除重复项的非常简单的方法(如果您可以转换为元组/其他可散列项目)是使用集合作为中间元素。
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)))]
答案 1 :(得分: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]]
答案 2 :(得分:0)
使用sets
来跟踪所看到的项目,但由于集合只能包含可散列项目,因此您可能必须首先将元组的项目转换为某个可清除值(在本例中为元组)。
设置提供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])
答案 3 :(得分:0)
如果订单有问题:
>>> 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)])