enhancing 'list'

Peter Otten __peter__ at web.de
Mon Jan 18 07:20:19 EST 2010


samwyse wrote:

> On Jan 18, 3:06 am, Peter Otten <__pete... at web.de> wrote:
>> samwyse wrote:
>> > Lately, I've slinging around a lot of lists, and there are some simple
>> > things I'd like to do that just aren't there.
>>
>> > s.count(x[, cmp[, key]])
>> > - return number of i‘s for which s[i] == x.  'cmp' specifies a custom
>> > comparison function of two arguments, as in '.sort'.  'key' specifies
>> > a custom key extraction function of one argument.
>>
>> What's your use case exactly? If I were to enhance count/index/rindex I
>> would go for the simpler
>>
>> >>> missing = object()
>> >>> class List(list):
>>
>> ...     def count(self, value=missing, predicate=missing):
>> ...             if value is missing:
>> ...                     if predicate is missing:
>> ...                             raise TypeError
>> ...                     return sum(1 for item in self if predicate(item))
>> ...             else:
>> ...                     if predicate is not missing:
>> ...                             raise TypeError
>> ...                     return list.count(self, value)
>> ...>>> items = List(range(10))
>> >>> items.count(7)
>> 1
>> >>> items.count(predicate=lambda item: item%3)
>>
>> 6
>>
>> which nicely covers all applications I can imagine.
>>
>> Peter
> 
> That is a good idea.  However, I was looking more at the simplicity of
> building of ideas that are already present in .sort.  And this
> implementation is pretty simple as well.

Note that the cmp() builtin and the cmp parameter for list.sort() are gone 
in Python 3.
 
>>>> class List(list):
> import __builtin__
> def count(self, value, cmp=__builtin__.cmp):
> return sum(1 for item in self if not cmp(item, value))
> 
> 
>>>> items = List(range(10))
>>>> items.count(7)
> 1
>>>> items.count(3, lambda a, b: not a%b)  # My way
> 6
>>>> items.count(Ellipsis, lambda a, b: not a%3)  # Your way
> 6
> 
> As a side note, wouldn't it be nice if '...' could be used in more
> places than just slices?  IMHO, a useful idiom would be to use it to
> signify "irrelevant" or "don't care", as opposed to 'None' which (in
> my mind, at least) signifies "missing" or "unknown".

That is a pretty subtle distinction...

I prefer keyword arguments, but in Python 3 you can use the ellipsis literal 
freely:

>>> ... == ...
True
>>> [..., 42, ...].count(...)
2

Peter



More information about the Python-list mailing list