Tôi có một danh sách các danh sách bằng Python:
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
Và tôi muốn loại bỏ các yếu tố trùng lặp khỏi nó. Nếu nó là một danh sách bình thường không phải là danh sách tôi có thể sử dụng set. Nhưng thật không may, danh sách đó không thể băm và không thể tạo bộ danh sách. Chỉ trong số các bộ giá trị. Vì vậy, tôi có thể chuyển tất cả danh sách thành bộ giá trị sau đó sử dụng thiết lập và quay lại danh sách. Nhưng điều này không nhanh.
Làm thế nào điều này có thể được thực hiện một cách hiệu quả nhất?
Kết quả của danh sách trên sẽ là:
k = [[5, 6, 2], [1, 2], [3], [4]]
Tôi không quan tâm đến việc giữ gìn trật tự.
Lưu ý: câu hỏi này tương tự nhưng không hoàn toàn là những gì tôi cần. Đã tìm SO nhưng không tìm thấy bản sao chính xác.
Điểm chuẩn:
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)
"loop in" (phương pháp bậc hai) nhanh nhất đối với danh sách ngắn. Đối với danh sách dài, nó nhanh hơn mọi người ngoại trừ phương pháp theo nhóm. Điều này có nghĩa không?
Đối với danh sách ngắn (danh sách trong mã), 100000 lần lặp:
[set] Elapsed: 1.3900001049
[sort] Elapsed: 0.891000032425
[groupby] Elapsed: 0.780999898911
[loop in] Elapsed: 0.578000068665
Đối với danh sách dài hơn (danh sách trong mã được sao chép 5 lần):
[set] Elapsed: 3.68700003624
[sort] Elapsed: 3.43799996376
[groupby] Elapsed: 1.03099989891
[loop in] Elapsed: 1.85900020599