Python에 목록 목록이 있습니다.
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
그리고 중복 요소를 제거하고 싶습니다. 내가 사용할 수있는 목록이 아닌 일반 목록이었다 set. 그러나 불행히도 그 목록은 해시 할 수 없으며 목록 집합을 만들 수 없습니다. 튜플 만. 따라서 모든 목록을 튜플으로 전환 한 다음 집합을 사용하고 다시 목록으로 돌아갈 수 있습니다. 그러나 이것은 빠르지 않습니다.
가장 효율적인 방법으로이를 수행 할 수있는 방법은 무엇입니까?
위 목록의 결과는 다음과 같아야합니다.
k = [[5, 6, 2], [1, 2], [3], [4]]
나는 질서를 보존하는 것에 관심이 없습니다.
참고 : 이 질문 은 비슷하지만 내가 필요한 것은 아닙니다. 검색했지만 정확한 중복을 찾지 못했습니다.
벤치마킹 :
import itertools, time
class Timer(object):
def __init__(self, name=None):
self.name = name
def __enter__(self):
self.tstart = time.time()
def __exit__(self, type, value, traceback):
if self.name:
print '[%s]' % self.name,
print 'Elapsed: %s' % (time.time() - self.tstart)
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [5, 2], [6], [8], [9]] * 5
N = 100000
print len(k)
with Timer('set'):
for i in xrange(N):
kt = [tuple(i) for i in k]
skt = set(kt)
kk = [list(i) for i in skt]
with Timer('sort'):
for i in xrange(N):
ks = sorted(k)
dedup = [ks[i] for i in xrange(len(ks)) if i == 0 or ks[i] != ks[i-1]]
with Timer('groupby'):
for i in xrange(N):
k = sorted(k)
dedup = list(k for k, _ in itertools.groupby(k))
with Timer('loop in'):
for i in xrange(N):
new_k = []
for elem in k:
if elem not in new_k:
new_k.append(elem)
짧은 목록의 경우 가장 빠른 "루프 인"(2 차 방법)입니다. 긴 목록의 경우 groupby 방법을 제외한 모든 사람보다 빠릅니다. 이게 말이 돼?
짧은 목록 (코드에있는 목록)의 경우 100000 회 반복 :
[set] Elapsed: 1.3900001049
[sort] Elapsed: 0.891000032425
[groupby] Elapsed: 0.780999898911
[loop in] Elapsed: 0.578000068665
더 긴 목록의 경우 (코드에있는 항목이 5 번 복제 됨) :
[set] Elapsed: 3.68700003624
[sort] Elapsed: 3.43799996376
[groupby] Elapsed: 1.03099989891
[loop in] Elapsed: 1.85900020599