配列で満たされた Python のリストがあります。
([4,1,2],[1,2,3],[4,1,2])
重複した配列を削除するにはどうすればよいですか?
配列で満たされた Python のリストがあります。
([4,1,2],[1,2,3],[4,1,2])
重複した配列を削除するにはどうすればよいですか?
重複を削除する非常に簡単な方法 (タプル/他のハッシュ可能なアイテムに変換しても問題ない場合) は、セットを中間要素として使用することです。
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)))]
順序が重要な場合:
>>> 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)])
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]]
表示されたアイテムを追跡するために使用sets
しますが、セットにはハッシュ可能なアイテムのみを含めることができるため、最初にタプルのアイテムをハッシュ可能な値 (この場合は tuple) に変換する必要がある場合があります。
セットは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])