Miki, That sounds quite a bit like: from itertools import imap, izip argmax = lambda funct, items: max(izip(imap(funct, items), items)) argmin = lambda funct, items: min(izip(imap(funct, items), items)) Which breaks ties on vals using a comparison with items (I don't know if this is desireable to you). Running a quick test on large sequences (range(100000)) with a relatively simple function (lambda a:a*a) produces the following timings on my machine (best of 7): argmax: 5.953 seconds (with std. dev. of .01455 seconds) izipimap: 5.844 seconds (with std. dev. of .03009 seconds) zipmap: 6.407 seconds (with std. dev. of .072356 seconds) Seems to be a small win for itertools, a close second for your original argmax, and a harrowing loss for map and zip on large sequences. I don't know how anyone would feel about adding it to the standard library, - Josiah > Do you think there is a place for an "argmax" function (which I use a lot) > in the standard library? > > I'm thinking in the lines of: > > def argmax(items, func, cmp=cmp): > '''argmax(items, func) -> max_item, max_value''' > it = iter(items) > # Initial values > try: > item = it.next() > except StopIteration: > raise ValueError("can't run over empty sequence") > val = func(item) > > for i in it: > v = func(i) > if cmp(v, val) == 1: > item = i > val = v > return item, val > > def argmin(items, func, cmp=cmp): > '''argmin(items, func) -> min_item, min_value''' > return argmax(items, func, lambda x,y : -cmp(x,y))
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4