[Python-ideas] dict.fromkeys() better as dict().setkeys() ? (and other suggestions)

Ron Adam rrr at ronadam.com
Wed May 30 05:30:19 CEST 2007


Steve Howell wrote:
> --- Ron Adam <rrr at ronadam.com> wrote:
> 
>> Steve Howell wrote:
>>> --- Ron Adam <rrr at ronadam.com> wrote:
>>>> # Tests
>>>>
>>>> def a_g(s):
>>>>     return s[0].lower() in "abcdefg"
>>>>
>>>> def h_m(s):
>>>>     return s[0].lower() in "hijklm"
>>>>
>>>> def n_z(s):
>>>>     return s[0].lower() in "nopqrstuvwxyz"
>>>>
>>>> decmps = [a_g, h_m, n_z]
>>>> ag, hm, nz, other = decomp(src, *decmps)
>>>>
>>>> print 'ag =', ag
>>>> print 'hm =', hm
>>>> print 'nz =', nz
>>>> print 'other =', other
>>>>
>>>>
>>>> -------------------
>>>>
>>>> ag = ['c8WQe60G6J', 'EMY7O8qzTg']
>>>> hm = ['lDunyeOM98', 'LJuPg8ncZd']
>>>> nz = ['uhhuhd9YdO', 'qAuQvfTc6N', 'vpJz47pkP5',
>>>> 'YOq6m4IXBn']
>>>> other = ['8JE6PuXxBz', '4ttyMdpuQY']
>>>>
>>> Am I misunderstanding (de-comprehensing) something
>>> here?  How does the code above return those result
>>> sets?  Or, more specifically, why does ag include
>> 'T'
>>> in its results set?
>> The data in this case simulates 10 digit partnumbers
>> which can include a-z, 
>> A-Z, and 0-9.
>>
>> It doesn't alter the data, it just sorts it into
>> smaller groups according 
>> to some predefined tests.  In this case.. it's only
>> testing the first 
>> letter of each item.
>>
>> What is tested is entirely up to you.  You could
>> have lists of records as 
>> your data and test fields and divide the data
>> according to that.
>>
> 
> Ok, apologies for quoting away the parts of your code
> that probably answer my own question.
> 
> But to your bigger question--I think you can set up a
> list comprehension that does partitioning by having
> the list comprension or generator expression simply
> return a list of tuples where the first element in the
> tuple is a value that suggest where it fits in the
> partition, then feed that tuple to dict() or whatever.
> 
> But I don't have a specific code example to prove it.

That would depend on what level of abstraction you want.  I find python 
already handles the simple things fairly well, so I tend to look for the 
next level up now.  That makes it a bit harder to find the balance between 
being too specific and too general.


 > For simple binary partitions, there is the bool
 > function.

Or more likely you may have a method in a class that tests for a particular 
condition.

     pass, fail = decomp(list_of_classes, lambda x: x.test())


Cheers,
   Ron



More information about the Python-ideas mailing list