trictionary?
Adam Tomjack
adamtj at adamtj.org
Sun Aug 28 18:55:00 EDT 2005
Oops, I found a bug in my previous code.
If you say
bin_item = bin.setdefault(x, [1, 0])
bin_item[0] += 1
then if x wasn't in bin, it'll get initialized to [1, 0], then
incremented to [2, 0] in the first loop. The code you asked about would
have produced [1, 0]. Instead, you can say:
bin_item = bin.setdefault(x, [0, 0])
bin_item[0] += 1
That should be equivalent. My example with the class is similarly broken.
Adam
Adam Tomjack wrote:
> Randy,
>
> I'd probably use a two element list.
>
> Instead of using an if/else to check if an element is in your dict and
> initialize it, you can use the setdefault() function. The docs for
> dictionaries explain it pretty well.
>
> bin = {}
> for whatever:
> for [a, b] in foo:
> x = 42 - a
> bin_item = bin.setdefault(x, [1, 0])
> bin_item[0] += 1
> for x, (y, z) in bin.iteritems():
> print x, y, z
>
> You could also use a class like a C-style struct if you want named items:
>
> class BinItem:
> def __init__(self, s=0, t=0):
> self.s = s
> self.t = t
>
> bin = {}
> for a, b in foo:
> x = 42 - a
> bin_item = bin.setdefault(x, BinItem(1, 0))
> bin_item.s += 1
>
> for x, item in bin.iteritems():
> print x, item.s, item.t
>
>
> Luck in battle,
>
> Adam
>
>
> Randy Bush wrote:
>
>>i have some code which looks kinda like
>>
>> bin = {}
>> for whatever:
>> for [a, b] in foo:
>> x = 42 - a
>> y = 42 - b
>> if bin.has_key(x):
>> bin[x] += 1
>> else:
>> bin[x] = 1
>> for i, j in bin.iteritems():
>> print i, j
>>
>>now i want to add a second count column, kinda like
>>
>> bin = {}
>> for whatever:
>> for [a, b] in foo:
>> x = 42 - a
>> if bin.has_key(x):
>> bin[x.b] += 1
>> else:
>> bin[x.b] = 1
>> bin[x.not b] = 0
>> for x, y, z in bin.iteritems():
>> print x, y, z
>>
>>should the dict value become a two element list, or is
>>there a cleaner way to do this?
>>
>>randy
>>
>
>
>
>
>
More information about the Python-list
mailing list