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