2011-11-01 13 views
9

मैं इस तरह एक आंकड़ा संरचना है:ऑर्डर संरक्षित करते समय अस्थिर तत्व युक्त पाइथन सूची से डुप्लिकेट तत्वों को हटा रहा है?

[ 
[('A', '1'), ('B', '2')], 
[('A', '1'), ('B', '2')], 
[('A', '4'), ('C', '5')] 
] 

और मैं इस प्राप्त करने के लिए करना चाहते हैं:

[ 
[('A', '1'), ('B', '2')], 
[('A', '4'), ('C', '5')] 
] 

वहाँ ऐसा करने, जबकि दिखाया गया है आदेश के संरक्षण के लिए एक अच्छा तरीका है?

कॉपी-पेस्ट करने के लिए आदेश:

sample = [] 
sample.append([('A', '1'), ('B', '2')]) 
sample.append([('A', '1'), ('B', '2')]) 
sample.append([('A', '4'), ('C', '5')]) 
+0

डुप्लिकेट हमेशा आसन्न हैं? – Cameron

+0

@ कैमरॉन: जरूरी नहीं। – Legend

उत्तर

7

यह कुछ हद तक एक प्रसिद्ध सवाल जो अच्छी तरह से बहुत पहले एक प्रसिद्ध Pythonista द्वारा उत्तर दिया गया था: http://code.activestate.com/recipes/52560-remove-duplicates-from-a-sequence/

आप यह मान सकते हैं बराबर रिकॉर्ड निकट हैं, वहाँ है itertools docs में एक नुस्खा:

from operator import itemgetter 
from itertools import groupby, imap 

def unique_justseen(iterable, key=None): 
    "List unique elements, preserving order. Remember only the element just seen." 
    # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B 
    # unique_justseen('ABBCcAD', str.lower) --> A B C A D 
    return imap(next, imap(itemgetter(1), groupby(iterable, key))) 

आप केवल orderable तत्वों एक प्रकार द्विविभाजित मीटर का उपयोग कर मान, यहाँ कर सकते हैं odule। एनआर अद्वितीय मानों के साथ इनपुट, इसकी खोज चरण लागत O (n लॉग आर) है। यदि कोई नया अद्वितीय मूल्य मिलता है, तो यह में सूची ओ (आर * आर) की लागत के लिए डाली गई है।

from bisect import bisect_left, insort 

def dedup(seq): 
    'Remove duplicates. Preserve order first seen. Assume orderable, but not hashable elements' 
    result = [] 
    seen = [] 
    for x in seq: 
     i = bisect_left(seen, x) 
     if i == len(seen) or seen[i] != x: 
      seen.insert(i, x) 
      result.append(x) 
    return result 
+0

टिम पीटर्स द्वारा एकमात्र ऑर्डर-संरक्षित नुस्खा ब्रूट फोर्स है। ऑर्डर को संरक्षित करते समय ओ (एन लॉग एन) प्रदर्शन को रखने के लिए सॉर्टिंग रेसिपी को संशोधित किया जा सकता है। –

+0

आदेश-संरक्षित रूप एलेक्स मार्टेलि द्वारा हैं और टिप्पणियों में टिम के कोड के नीचे सूचीबद्ध हैं। –

+2

जहां तक ​​मैं कह सकता हूं, एलेक्स मार्टेलि के रूपों में सभी क्षमता स्थिरता मानते हैं। –

5

यहां सॉर्ट/अद्वितीय मुहावरे का ऑर्डर-संरक्षित संस्करण है। यह आपको ओ (एन लॉग एन) प्रदर्शन देगा, बशर्ते आपके आइटम कम से कम क्रमबद्ध हों।

def unique(a): 
    indices = sorted(range(len(a)), key=a.__getitem__) 
    indices = set(next(it) for k, it in 
        itertools.groupby(indices, key=a.__getitem__)) 
    return [x for i, x in enumerate(a) if i in indices] 

उदाहरण (सादगी के लिए hashable आइटम के साथ):

>>> a = ['F', 'J', 'B', 'F', 'V', 'A', 'E', 'U', 'B', 'U', 'Z', 'K'] 
>>> unique(a) 
['F', 'J', 'B', 'V', 'A', 'E', 'U', 'Z', 'K'] 
+0

अच्छा। यह देखने में एक मिनट लगते हैं कि यह कैसे काम करता है। चतुर। –

संबंधित मुद्दे

 संबंधित मुद्दे