Dave Angel wrote:
Krishna Pacifici wrote:
Hi,
I want to be able to add multiple new values to a key in a dictionary.

I have tried the following:

sec_dict_clean=
{88: [87, 89, 78, 98], 58: [57, 59, 48, 68], 69: [79], 95: [94, 96, 85]}

for i in range(len(sec_dict_clean.values())):
    for j in range(len(sec_dict_clean.values()[i])):
sec_dict_clean.setdefault(key,[]).append(blocks[sec_dict_clean.values()[i][j]].abundance)

where blocks[...].abundance gives me a single value from an object,

but this gives me the following:

sec_dict_clean=
{88: [87, 89, 78, 98], 58: [57, 59, 48, 68], 69: [79], 95: [94, 96, 85, 4, 12, 11, 6, 9, 12, 11, 7, 10, 10, 12, 9, 6, 12, 15, 9, 8, 12, 15, 12, 12]}

instead I want each abundance (starts with 4, 12...) to be associated with each of the values so that it would look like this:

sec_dict_clean=
{88: ([87, 89, 78, 98], [4,12,11,6]), 58: ([57, 59, 48, 68], [9,12,11,7]), 69: ([79], [10])...}

You can see there are several errors here (I have more things being appended than there are values in the dictionary), but I really just want to know how to add multiple values to the same key in a dictionary.

Thanks for any help,
Krishna



You're really distorting the purposes of both dictionary and list here. It makes your code totally unreadable, which makes it hard to write, and hard to debug.

A dictionary is a mapping between key and value, where each key has exactly one value. You cannot add another one to it. All you can do is make the value something which is itself a collection. Now, your desired dictionary looks achievable, almost. If you change the parens (tuple) to square brackets (list), then it'll work. So key 88 has a single value, which is a list of two items. Each of those items is itself a list with 4 items. And each of those items are integers.

But then I got bogged down in your sample code. I tried to simplify it, replacing the first two lines with these three:

for i, key in enumerate(sec_dict_clean):
   val = sec_dict_clean[key]
   for j, xxx in enumerate(val):
???sec_dict_clean.setdefault(key,[]).append(blocks[sec_dict_clean.values()[i][j]].abundance)

But I can't make head nor tail of the third line. You didn't have a variable key, so I don't know if I'm using the same one.. Since I can't figure out what you were trying to do, I can't see how to fix it.

I think the problem here is you're trying to reorganize the data as well as adding to it, in a single pass. So is some previous code generating the dictionary incorrectly, and instead of fixing that, you're trying to reorganize it here?

To make each dictionary value a list of lists:

sec_dict_clean=
{88: [87, 89, 78, 98], 58: [57, 59, 48, 68], 69: [79], 95: [94, 96, 85]}

for key in sec_dict_clean:
   sec_dict_clean[key] = [sec_dict_clean[key]]

now,  the dict looks like:
{88: [[87, 89, 78, 98, 3]], 58: [[57, 59, 48, 68]], 69: [[79]], 95: [[94, 96, 85]]}

At this point, if you have some interesting data to add to it, you can just append a new list to
    dict[key]

In an earlier message, you mentioned fields a and b, and assuming this is a similar problem, it would seem that 87 is somehow associated with 4, and 89 with 12, and so on. If that's the case, perhaps your desired final structure might look more like:

{88: [[87,4], [89,12], [78, 11],[98, 6], 58: [[57, 9], [59, 12], [48, 11], [68, 7]], 69: ...}


In this case, the structure is entirely different. But the approach is the same. And at least you'd be getting closer to the object approach where [87,4] is replaced by an object of some type.

BTW, please don't top-post. When you reply to this one, put your reply at the end, or sometimes interspersed. But if you put it at the beginning, it's out of order.

DaveA




Look at the following (tested in Python 2.6.2)., There are a number of things that could be cleaner, mainly the names of things. I should never be calling something "value" unless it's a very generic routine.

<code>
class Sample(object):
   def __init__(self, mainval):
       self.mainval = mainval
       self.a = self.b = None
   def set_tags(self, a, b):
       self.a = a
       self.b = b
   def __repr__(self):
return "<" + str(self.mainval) + " a=" + str(self.a) + " b=" + str(self.b) + ">"


diction2 = {88: [Sample(87), Sample(89), Sample(98), Sample(3)],
           58: [Sample(57), Sample(59), Sample(48), Sample(68)],
           69: [Sample(79)]
                }

print diction2

for key, valuelist in diction2.iteritems():
   for item in valuelist:
item.set_tags(12, 106) #here's where you'd be using that mysterious blocks dictionary

print diction2

</code>

DaveA
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to