Modal value of an array

Paddy paddy3118 at googlemail.com
Thu Mar 29 18:44:56 EDT 2007


On Mar 29, 8:49 am, a... at mac.com (Alex Martelli) wrote:
> Ben Finney <bignose+hates-s... at benfinney.id.au> wrote:
>
>    ...
>
> > That's not the only case though. What do you expect to be returned for
> > an input of ["eggs", "beans", "beans", "eggs", "spam"] ?
>
> > Assuming you want *a* mode value, and any one will do (e.g. any of
> > "spam", "eggs" or "beans" is okay), I'd write it this way as a first
> > guess:
>
> >     >>> foo = ["spam", "eggs", "spam", "spam", "spam", "beans", "eggs"]
> >     >>> counts = [(foo.count(val), val) for val in set(foo)]
> >     >>> counts
> >     [(2, 'eggs'), (1, 'beans'), (4, 'spam')]
> >     >>> sorted(counts)[-1]
> >     (4, 'spam')
> >     >>> sorted(counts)[-1][1]
> >     'spam'
>
> A bit more directly:
>
> >>> foo = ["spam", "eggs", "spam", "spam", "spam", "beans", "eggs"]
> >>> max(foo, key=foo.count)
>
> 'spam'
>
> Alex

This doesn't call foo.count for duplicate entries by keeping a cache

>>> foo = ["spam", "eggs", "spam", "spam", "spam", "beans", "eggs"]
>>> def cachecount(x, cache={}):
... 	return cache.setdefault(x, foo.count(x))
...
>>> max(foo, key=cachecount)
'spam'
>>> cachecount.func_defaults
({'eggs': 2, 'beans': 1, 'spam': 4},)
>>>

- Paddy.




More information about the Python-list mailing list