Convert (sorted) list of dics to nested list ?

Larry Bates larry.bates at websafe.com
Tue Mar 21 15:12:11 CET 2006


shearichard at gmail.com wrote:
> Hi - I want to take something like ...
> 
> lstIn = []
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 10, 'LEA_AUTOID': 1000})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2000})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2001})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2003})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3000})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3001})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3002})
> lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3003})
> lstIn.append({'COM_AUTOID': 2, 'PRG_AUTOID': 110, 'LEA_AUTOID': 4000})
> 
> 
> ... and produce something like ...
> 
> sampleOut =
> [[1,[10,1000]],[1,[11,[2000,2001,2003]]],[1,[12,[3000,3001,3002,3003]]],[2,[110,4000]]
> 
> 
> Well I've now been around the block a few times with this one and I'm
> still frowning !! In the process my code has become uglier and uglier -
> I'm sure there must be quite an elegant way of dealing with it - could
> anyone give me a push in the right direction ?
> 
> Just to provide some motivation here - I should just say that this is
> cut down test case - the real problem involves creating a Javascript
> structure which in turn defines a three level menu.
> 
> The resulting JS will be something like this, I think you can see how
> the nested loops get into it.:
> 
> var MENU_ITEMS = [
>     { pos:'relative', leveloff:[b,a], itemoff:[d,c], size:[e,f], ... },
>     { ...Item 1... },
>     { ...Item 2... ,
>         sub:[
>             { ...level format... },
>             { ...Item 1... },
>             { ...Item 2... },
>             { ...Item 3... ,
>                 sub:[
>                     { ...level format... },
>                     { ...Item 1... },
>                     { ...Item 2... },
>                     { ...Item 3... },
>                     { ...Item 4... }
>                 ]
>             },
>             { ...Item 4... },
>         ]
>     },
>     { ...Item 3... }
> ];
> 
> Interested to hear of any smart/elegant ideas.
> 
> thanks
> 
> Richard.
> 
Might not be 'elegant', but at least it works.

-Larry

lstIn = []
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 10, 'LEA_AUTOID': 1000})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2000})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2001})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 11, 'LEA_AUTOID': 2003})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3000})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3001})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3002})
lstIn.append({'COM_AUTOID': 1, 'PRG_AUTOID': 12, 'LEA_AUTOID': 3003})
lstIn.append({'COM_AUTOID': 2, 'PRG_AUTOID': 110, 'LEA_AUTOID': 4000})

c="COM_AUTOID"
p="PRG_AUTOID"
l="LEA_AUTOID"

lastc=None
lastp=None

sampleOut=[]
for entry in lstIn:
    C=entry[c]
    P=entry[p]
    L=entry[l]
    if C != lastc or P != lastp: sampleOut.append([C,[P,L]])
    else: sampleOut[-1:][0][1].append(L)
    lastc=C
    lastp=P

print "sampleOut=", sampleOut



More information about the Python-list mailing list