Hi guys,
I love the optional key to Python's sort() and max() functions, and
I've found it handy when unique-ifying lists with web.py's
utils.uniq() function. Very useful when you're making unique a list of
web.storage() objects or something, for example de-duping a list of
rows from the database based on some column or transform on a column.
So here's my updated version of uniq() that handles an optional key
(with a unit test for the key case):
----------
def uniq(seq, key=None):
"""Remove duplicate elements from given sequence (using key
function to transform
items, if given).
>>> uniq([1, 2, 3, 1, 4, 5, 6])
[1, 2, 3, 4, 5, 6]
>>> uniq(['Foo', 'bar', 'Bar', 'FOO', 'bill'], key=str.lower)
['Foo', 'bar', 'bill']
"""
seen = set()
result = []
for item in seq:
if key is None:
item_key = item
else:
item_key = key(item)
if item_key in seen:
continue
seen.add(item_key)
result.append(item)
return result
----------
Yes, I know, I don't have to test "key is None" each time around the
loop. However, I figured that a test against None would be
significantly faster that calling a (no-op) function each time around
the loop.
Also, I noticed when running the unit tests for utils.py that
datestr() fails, because "%e" isn't a valid strftime formatting
operator. It's not in the documentation () -- perhaps it's a Linux-
only thing?
Thanks,
Ben.
--
You received this message because you are subscribed to the Google Groups
"web.py" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/webpy?hl=en.