[Python-Dev] Re: Candidate Itertools

Raymond Hettinger python at rcn.com
Tue Jun 15 15:07:40 EDT 2004


[David Eppstein]
> I'd probably use count_elements, but as Bob I. already said, I'd
prefer
> the dict to the transposed pairs of its items.

An alternate dictionary constructor would provide that flexibility:

  def countkeys(cls, iterable):
      b = cls()
      for elem in iterable:
          [elem] = b.get(elem, 0) + 1
      return b

However, the added flexibility makes the use case more complicated:


  >>> from heapq import nlargest
  >>> words = (word  for line in myfile  for word in line.split())
  >>> nlargest(3, pairwise(dict.countkeys(words).iteritems()))
  [(200, 'super'), (129, 'hero'), (103, 'villain')]

That last line is much more involved than writing:

  >>> nlargest(3, count_elements(words))

I find the latter to be more readable and to be a more obvious tool for
working with nlargest(), nsmallest(), sorted(), min(), and max().  Also,
it does less work under the hood because it doesn't have to build two
different tuples for each entry.

OTOH, if you actually want to end-up with a dictionary, it is somewhat
wasteful to build one, throw it away, and then rebuild it from the
itemlist:

  >>> dict(count_elements(words))



Raymond




More information about the Python-Dev mailing list