creating and appending to a dictionary of a list of lists

P

pyscottishguy

Hey,

I started with this:

factByClass = {}

def update(key, x0, x1, x2, x3):
x = factByClass.setdefault(key, [ [], [], [], [] ])
x[0].append(x0)
x[1].append(x1)
x[2].append(x2)
x[3].append(x3)

update('one', 1, 2, 3, 4)
update('one', 5, 6, 7, 8)
update('two', 9, 10, 11, 12)

print factByClass

{'two': [[9], [10], [11], [12]], 'one': [[1, 5], [2, 6], [3, 7], [4,
8]]}

I then 'upgraded' to this:

def update(key, *args):
x = factByClass.setdefault(key, [[], [], [], [] ])
for i, v in enumerate(args):
x.append(v)

Is there a better way?
Cheers!
 
A

Ant

Hey,

I started with this:

factByClass = {}
....
def update(key, *args):
x = factByClass.setdefault(key, [[], [], [], [] ])
for i, v in enumerate(args):
x.append(v)

Is there a better way?


Well, the following is perhaps neater:
factByClass = defaultdict(lambda: [[],[],[],[]])
def update(key, *args):
.... map(list.append, factByClass[key], args)
....defaultdict(<function <lambda> at 0x00F73430>, {'two': [[9], [1
0], [11], [12]], 'one': [[1, 5], [2, 6], [3, 7], [4, 8]]})

It abuses the fact that list.append modifies the list in place -
normally you would use map to get a new list object. In this case the
new list returned by map is just a list of None's (since append
returns None - a common idiom for functions that operate by side
effect), and so is not used directly.
 
P

pyscottishguy

I started with this:
factByClass = {}
...
def update(key, *args):
x = factByClass.setdefault(key, [[], [], [], [] ])
for i, v in enumerate(args):
x.append(v)

Is there a better way?

Well, the following is perhaps neater:
factByClass = defaultdict(lambda: [[],[],[],[]])
def update(key, *args):

... map(list.append, factByClass[key], args)
...>>> update('one', 1, 2, 3, 4)
defaultdict(<function <lambda> at 0x00F73430>, {'two': [[9], [1
0], [11], [12]], 'one': [[1, 5], [2, 6], [3, 7], [4, 8]]})

It abuses the fact that list.append modifies the list in place -
normally you would use map to get a new list object. In this case the
new list returned by map is just a list of None's (since append
returns None - a common idiom for functions that operate by side
effect), and so is not used directly.


Nice. I like it. Thanks a lot!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,188
Latest member
Crypto TaxSoftware

Latest Threads

Top