Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Convert (sorted) list of dics to nested list ?

Reply
Thread Tools

Convert (sorted) list of dics to nested list ?

 
 
shearichard@gmail.com
Guest
Posts: n/a
 
      03-21-2006
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.

 
Reply With Quote
 
 
 
 
Larry Bates
Guest
Posts: n/a
 
      03-21-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) 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
 
Reply With Quote
 
 
 
 
Gerard Flanagan
Guest
Posts: n/a
 
      03-22-2006
(E-Mail Removed) 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]]
>
>


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"

d = {}

# convert data to nested dictionary structure
for item in lstIn:
c, p, l = item[C], item[P], item[L]
if c not in d:
d[c] = dict( {p : [l]} )
else:
if p not in d[c]:
d[c][p] = [l]
else:
d[c][p].append(l)

def dict2list( adict ):
for key in sorted(adict.keys()):
if isinstance( adict[key], dict ):
for item in dict2list(adict[key]):
yield [key] + item
else:
yield [[key] + [adict[key]]]

result = list(dict2list(d))

cigar =
[[1,[10,1000]],[1,[11,[2000,2001,2003]]],[1,[12,[3000,3001,3002,3003]]],[2,[110,4000]]]
no_cigar =
[[1,[10,[1000]]],[1,[11,[2000,2001,2003]]],[1,[12,[3000,3001,3002,3003]]],[2,[110,[4000]]]]

assert result == no_cigar

print
print 'nested dict: ', d
print
print 'result: ', result

nested dict: {1: {10: [1000], 11: [2000, 2001, 2003], 12: [3000, 3001,
3002, 3003]}, 2: {110: [4000]}}

result: [[1, [10, [1000]]], [1, [11, [2000, 2001, 2003]]], [1, [12,
[3000, 3001, 3002, 3003]]], [2, [110, [4000]]]]

Gerard

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How convert list to nested dictionary? macm Python 12 11-11-2010 08:36 AM
Is nested class automatically friend of class that it is nested in? request@no_spam.com C++ 5 09-25-2006 08:31 AM
Nested Vector Nester Classes are Nested in my Brain Chad E. Dollins C++ 3 11-08-2005 04:46 AM
Nested iterators (well, not nested exactly...) Russ Perry Jr Java 2 08-20-2004 06:51 PM
convert list of strings to set of regexes; convert list of strings to trie Klaus Neuner Python 7 07-26-2004 07:25 AM



Advertisments