Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Remove duplicates from sequence

Remove duplicates from sequence 12 Χρόνια 8 Μήνες πριν #1539

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Από ΕΔΩ
import time
from random import shuffle, randint
import re
from sets import Set
 
def f1(seq):
    # Raymond Hettinger
    # not order preserving
    set = {}
    map(set.__setitem__, seq, [])
    return set.keys()
 
def f2(seq):
    # order preserving
    checked = []
    for e in seq:
        if e not in checked:
            checked.append(e)
    return checked
 
def f3(seq):
    # Not order preserving
    keys = {}
    for e in seq:
        keys[e] = 1
    return keys.keys()
 
def f4(seq):
    # order preserving
    noDupes = []
    [noDupes.append(i) for i in seq if not noDupes.count(i)]
    return noDupes
 
def f5(seq, idfun=None):
    # Alex Martelli
    # order preserving
    if idfun is None:
        def idfun(x): return x
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        if marker in seen:
            continue
        seen[marker] = 1
        result.append(item)
    return result
 
def f5b(seq, idfun=None):
    # Alex Martelli
    # order preserving
    if idfun is None:
        def idfun(x): return x
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        if marker not in seen:
            seen[marker] = 1
            result.append(item)
 
    return result
 
def f6(seq):
    # Not order preserving
    return list(Set(seq))
 
def f7(seq):
    # Not order preserving
    return list(set(seq))
 
def f8(seq):
    # Dave Kirby
    # Order preserving
    seen = set()
    return [x for x in seq if x not in seen and not seen.add(x)]
 
def f9(seq):
    # Not order preserving
    return {}.fromkeys(seq).keys()
 
def f10(seq, idfun=None): # Andrew Dalke
    # Order preserving
    return list(_f10(seq, idfun))
 
def _f10(seq, idfun=None):
    seen = set()
    if idfun is None:
        for x in seq:
            if x in seen:
                continue
            seen.add(x)
            yield x
    else:
        for x in seq:
            x = idfun(x)
            if x in seen:
                continue
            seen.add(x)
            yield x
 
def f11(seq):
    # f10 but simpler
    # Order preserving
    return list(_f10(seq))
 
def _f11(seq):
    seen = set()
    for x in seq:
        if x in seen:
            continue
        seen.add(x)
        yield x
 
def timing(f, n, a):
    print f.__name__,
    r = range(n)
    t1 = time.clock()
    for i in r:
        f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a)
    t2 = time.clock()
    print round(t2-t1, 3)
 
def getRandomString(length=10, loweronly=1, numbersonly=0,
                    lettersonly=0):
    """ return a very random string """
    _letters = 'abcdefghijklmnopqrstuvwxyz'
    if numbersonly:
        l = list('0123456789')
    elif lettersonly:
        l = list(_letters + _letters.upper())
    else:
        lowercase = _letters+'0123456789'*2
        l = list(lowercase + lowercase.upper())
    shuffle(l)
    s = ''.join(l)
    if len(s) < length:
        s = s + getRandomString(loweronly=1)
    s = s[:length]
    if loweronly:
        return s.lower()
    else:
        return s
 
def main():
    testdata = []
    for i in range(10000):
        testdata.append(getRandomString(3, loweronly=True))
 
    #order_preserving = f2, f4, f5, f5b, f8, f10, f11  # f2 and f4 too slow...
    order_preserving = f5, f5b, f8, f10, f11
    not_order_preserving = f1, f3, f6, f7, f9
 
    print("Order preserving")
    print("----------------")
    for f in order_preserving:
        timing(f, 100, testdata)
 
    print("\nNot order preserving")
    print("--------------------")
    for f in not_order_preserving:
        timing(f, 100, testdata)
 
if __name__ == "__main__":
    main()
Τελευταία διόρθωση: 12 Χρόνια 8 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.589 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου