পাইথনে আমার তালিকার একটি তালিকা রয়েছে:
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
এবং আমি এটি থেকে সদৃশ উপাদানগুলি মুছে ফেলতে চাই। এটি যদি আমি ব্যবহার করতে পারি এমন তালিকার একটি সাধারণ তালিকা ছিল না set। তবে দুর্ভাগ্যজনক যে তালিকাটি হ্যাশযোগ্য নয় এবং তালিকার সেট তৈরি করতে পারে না। কেবল টুপলসের of সুতরাং আমি সমস্ত তালিকা টিপলগুলিতে পরিণত করতে পারি তারপরে সেট এবং আবার তালিকাগুলিতে ব্যবহার করতে পারি। তবে এটি দ্রুত নয়।
কীভাবে এটি সবচেয়ে কার্যকর উপায়ে করা যেতে পারে?
উপরের তালিকার ফলাফলটি হওয়া উচিত:
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)
সংক্ষিপ্ত তালিকার জন্য দ্রুততম "লুপ ইন" (চতুষ্কোণ পদ্ধতি)। দীর্ঘ তালিকাগুলির জন্য এটি দ্রুততর তবে গ্রুপবাই পদ্ধতি বাদে সবাই everyone এটা কোনো কিছু হলো?
সংক্ষিপ্ত তালিকার জন্য (কোডটিতে একটি), 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