Convert (sorted) list of dics to nested list ?
Larry Bates
larry.bates at websafe.com
Tue Mar 21 09:12:11 EST 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