# HG changeset patch # User Thierry Florac # Date 1593447690 -7200 # Node ID 82836485546c08a59d3c6ce4ceb3bc07f7cabecb # Parent b5131bd64de7285c6af025cfa5bd80358548d78f Added "unique_iter_max" function diff -r b5131bd64de7 -r 82836485546c src/pyams_utils/list.py --- a/src/pyams_utils/list.py Tue Jun 23 13:02:59 2020 +0200 +++ b/src/pyams_utils/list.py Mon Jun 29 18:21:30 2020 +0200 @@ -115,6 +115,30 @@ yield element +def unique_iter_max(iterable, key, sort_key): + """Get unique items sorted from an iterator + + :param iterable: source iterable + :param key: function used to get unique key from items + :param sort_key: function used to get sort key from items + + >>> from pyams_utils.list import unique_iter_max + >>> mylist = [('a', 1), ('b', 2), ('a', 3)] + >>> sorted(list(unique_iter_max(mylist, + ... key=lambda x: x[0], + ... sort_key=lambda x: x[1]))) + [('a', 3), ('b', 2)] + """ + seen = {} + for element in iterable: + k = key(element) + if k not in seen: + seen[k] = set() + seen[k].add(element) + for k, v in seen.items(): + yield sorted(v, key=lambda x: sort_key(x))[-1] + + def random_iter(iterable, limit=1): """Get items randomly from an iterator