"kj" wrote:
I suppose that I could write something like

def uniquify(items):
   seen = set()
   ret = []
   for i in items:
       if not i in seen:
           ret.append(i)
           seen.add(i)
   return ret

But this seems to me like such a commonly needed operation that I
find it hard to believe one would need to resort to such self-rolled
solutions.  Isn't there some more standard (and hopefully more
efficient, as in "C-coded"/built-in) approach?

The most "standard" way is a recipe from the itertools docs (I'd give a link, but python.org is down at the moment):

   def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
       # unique_everseen('AAAABBBCCDAABBB') --> A B C D
       # unique_everseen('ABBCcAD', str.lower) --> A B C D
       seen = set()
       seen_add = seen.add
       if key is None:
           for element in iterable:
               if element not in seen:
                   seen_add(element)
                   yield element
       else:
           for element in iterable:
               k = key(element)
               if k not in seen:
                   seen_add(k)
                   yield element

All the recipes mentioned there are pretty handy, so I've made a module (iterutil.py) out of them.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to