Thomas Nelson wrote: > I have this code: > type1 = [0] > type2 = [0] > type3 = [0] > map = {0:type1, 1:type1, 2:type3, 3:type1, 4:type2}
Warning : you're shadowing the builtin map() function. > # the real map is > longer than this > > def increment(value): > map[value][0] += 1 > > increment(1) > increment(1) > increment(0) > increment(4) > #increment will actually be called many times through other functions > print type1[0], type2[0], type3[0] > #should print "3 1 0" > > This is exactly what I want to do: every time I encounter this kind of > value in my code, increment the appropriate type by one. Then I'd like > to go back and find out how many of each type there were. This way > I've written seems simple enough and effective, but it's very ugly and > I don't think it's the intended use of lists. Not really. > Does anyone know a > cleaner way to have the same funtionality? # first replace the list hack class Counter(object): def __init__(self, name, *keys): self.name = name self.keys = keys self.count = 0 def inc(self): self.count += 1 # now wrap the whole thing in a convenient way class Counters(object): def __init__(self, *counters): self._counters = dict() self._counters_map = dict() for counter in counters: assert counter.name not in self._counters self._counters[counter.name] = counter for key in counter.keys: assert key not in self._counters_map self._counters_map[key] = counter def __getattr__(self, name): return self._counters[name].count def __getitem__(self, key): return self._counters_map[key].count def __call__(self, key): self._counters_map[key].inc() # and finally, let's use it: increment = Counters(Counter("type1", 0, 1, 3), Counter("type2", 4), Counter("type3", 2) ) increment(1) increment(1) increment(0) increment(4) print increment.type1, increment.type2, increment.type3 HTH -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list