utils.py
branchimmsview
changeset 31 13f56bb29b96
child 33 ad808d18c693
equal deleted inserted replaced
30:a7f7026f9416 31:13f56bb29b96
       
     1 #!/usr/bin/python
       
     2 
       
     3 import dircache, os.path
       
     4 from sys import stderr
       
     5 import readline
       
     6 
       
     7 def set_file_completer():
       
     8     readline.set_completer_delims('')
       
     9     readline.set_completer(_file_completer)
       
    10 
       
    11 def _file_completer(text, state):
       
    12     dirname, filename = os.path.split(text)
       
    13     if not os.path.isdir(dirname):
       
    14         return None
       
    15     paths = dircache.listdir(dirname)
       
    16     tlen = len(filename)
       
    17     checkpaths = []
       
    18     if tlen > 0:
       
    19         for fn in paths:
       
    20             if fn[:len(filename)] == filename:
       
    21                 checkpaths.append(fn)
       
    22     else:
       
    23         checkpaths = paths
       
    24     if len(checkpaths) > state:
       
    25         return os.path.join(dirname, checkpaths[state])
       
    26     return None
       
    27     
       
    28 def copy_file(origname, copyname):
       
    29     orig = file(origname, 'r')
       
    30     new = file(copyname, 'w')
       
    31     new.write(orig.read())
       
    32     new.flush()
       
    33     return new
       
    34 
       
    35 def unique(s):
       
    36     """Return a list of the elements in s, but without duplicates.
       
    37 
       
    38     For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
       
    39     unique("abcabc") some permutation of ["a", "b", "c"], and
       
    40     unique(([1, 2], [2, 3], [1, 2])) some permutation of
       
    41     [[2, 3], [1, 2]].
       
    42 
       
    43     For best speed, all sequence elements should be hashable.  Then
       
    44     unique() will usually work in linear time.
       
    45 
       
    46     If not possible, the sequence elements should enjoy a total
       
    47     ordering, and if list(s).sort() doesn't raise TypeError it's
       
    48     assumed that they do enjoy a total ordering.  Then unique() will
       
    49     usually work in O(N*log2(N)) time.
       
    50 
       
    51     If that's not possible either, the sequence elements must support
       
    52     equality-testing.  Then unique() will usually work in quadratic
       
    53     time.
       
    54     """
       
    55 
       
    56     n = len(s)
       
    57     if n == 0:
       
    58         return []
       
    59 
       
    60     # Try using a dict first, as that's the fastest and will usually
       
    61     # work.  If it doesn't work, it will usually fail quickly, so it
       
    62     # usually doesn't cost much to *try* it.  It requires that all the
       
    63     # sequence elements be hashable, and support equality comparison.
       
    64     u = {}
       
    65     try:
       
    66         for x in s:
       
    67             u[x] = 1
       
    68     except TypeError:
       
    69         del u  # move on to the next method
       
    70     else:
       
    71         return u.keys()
       
    72 
       
    73     # We can't hash all the elements.  Second fastest is to sort,
       
    74     # which brings the equal elements together; then duplicates are
       
    75     # easy to weed out in a single pass.
       
    76     # NOTE:  Python's list.sort() was designed to be efficient in the
       
    77     # presence of many duplicate elements.  This isn't true of all
       
    78     # sort functions in all languages or libraries, so this approach
       
    79     # is more effective in Python than it may be elsewhere.
       
    80     try:
       
    81         t = list(s)
       
    82         t.sort()
       
    83     except TypeError:
       
    84         del t  # move on to the next method
       
    85     else:
       
    86         assert n > 0
       
    87         last = t[0]
       
    88         lasti = i = 1
       
    89         while i < n:
       
    90             if t[i] != last:
       
    91                 t[lasti] = last = t[i]
       
    92                 lasti += 1
       
    93             i += 1
       
    94         return t[:lasti]
       
    95 
       
    96     # Brute force is all that's left.
       
    97     u = []
       
    98     for x in s:
       
    99         if x not in u:
       
   100             u.append(x)
       
   101     return u
       
   102 
       
   103