मेरे पास पायथन में सूचियों की एक सूची है:
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)
"लूप इन" (द्विघात विधि) छोटी सूचियों के लिए सबसे तेज। लंबी सूचियों के लिए यह तेजी से है, फिर समूह विधि को छोड़कर सभी को। इसका कोई मतलब भी है क्या?
छोटी सूची के लिए (कोड में एक), 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