ฉันมีรายชื่อใน Python:
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
และฉันต้องการลบองค์ประกอบที่ซ้ำกันออกไป ถ้าเป็นรายการปกติที่ฉันไม่สามารถsetใช้ได้ แต่โชคร้ายที่รายการนี้ไม่สามารถแฮชได้และไม่สามารถสร้างชุดรายการได้ เฉพาะของ tuples ดังนั้นฉันสามารถเปลี่ยนรายการทั้งหมดเป็นสิ่งที่เพิ่มขึ้นจากนั้นใช้การตั้งค่าและกลับไปที่รายการ แต่นี่ไม่เร็ว
วิธีนี้สามารถทำได้อย่างมีประสิทธิภาพมากที่สุด?
ผลลัพธ์ของรายการด้านบนควรเป็น:
k = [[5, 6, 2], [1, 2], [3], [4]]
ฉันไม่สนใจเรื่องการรักษาระเบียบ
หมายเหตุ: คำถามนี้คล้ายกัน แต่ไม่ใช่สิ่งที่ฉันต้องการ ค้นหา SO แต่ไม่พบรายการที่ซ้ำกัน
Benchmarking:
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" (วิธีกำลังสอง) เร็วที่สุดสำหรับรายการสั้น ๆ สำหรับรายการแบบยาวจะเร็วกว่าทุกคนยกเว้นเมธอด 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