From: Pete Emerson on 5 Mar 2010 20:22 I've been wrestling with dicts. I hope at the very least what I discovered helps someone else out, but I'm interested in hearing from more learned python users. I found out that adding a two dimensional element without defining first dimension existing doesn't work: >>> data = {} >>> data['one']['two'] = 'three' Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'one' >>> data['one'] = {} >>> data['one']['two'] = 'three' >>> print data {'one': {'two': 'three'}} And through some research, I discovered collections.defaultdict (new in Python 2.5, FWIW): >>> import collections >>> data = collections.defaultdict(dict) >>> data['one']['two'] = 'three' >>> print data defaultdict(<type 'dict'>, {'one': {'two': 'three'}}) Why isn't the behavior of collections.defaultdict the default for a dict? Am I just revelling in my bad perl habits by not wanting to declare a previous level first? Is this sort of "more rigid" way of doing things common throughout python, and is it best that I not fight it, but embrace it? Your thoughts and comments are very much appreciated. I think my brain already knows some of the answers, but my heart ... well, perl and I go way back. Loving python so far, though. Pete
From: Andreas Waldenburger on 5 Mar 2010 21:02 On Fri, 5 Mar 2010 17:22:14 -0800 (PST) Pete Emerson <pemerson(a)gmail.com> wrote: > I've been wrestling with dicts. I hope at the very least what I > discovered helps someone else out, but I'm interested in hearing from > more learned python users. > > I found out that adding a two dimensional element without defining > first dimension existing doesn't work: > > >>> data = {} > >>> data['one']['two'] = 'three' > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > KeyError: 'one' Yeah, because that key 'one' indexes what exactly? > [snip] > > And through some research, I discovered collections.defaultdict (new > in Python 2.5, FWIW): > > [snip] > > Why isn't the behavior of collections.defaultdict the default for a > dict? Because explicit is better than implicit. How should Python know what you want to fill your dict with? It could be anything that takes string indices. Only two lines of code remove all the guesswork. > Am I just revelling in my bad perl habits by not wanting to declare a > previous level first? Yes. Python pretty much never guesses (not that I knew of anyway). I think that is good, because it's just too easy to overlook some magic the language does and spend an hour trying to understand why that Toyota hit that wall. > Is this sort of "more rigid" way of doing things common throughout > python, and is it best that I not fight it, but embrace it? > Seriously, what answer do you expect? ;) When has fighting a language ever brought about something really cool. (I'm really looking forward to the geeky humorous replies this is bound to sprout.) > Your thoughts and comments are very much appreciated. I think my brain > already knows some of the answers, but my heart ... well, perl and I > go way back. Loving python so far, though. > Welcome on board. Have you typed "import this" in the command prompt yet? -- INVALID? DE!
From: Andreas Waldenburger on 5 Mar 2010 21:10 On Fri, 5 Mar 2010 17:22:14 -0800 (PST) Pete Emerson <pemerson(a)gmail.com> wrote: > [snip] > >>> data['one'] = {} > >>> data['one']['two'] = 'three' > >>> print data > {'one': {'two': 'three'}} > > And through some research, I discovered collections.defaultdict (new > in Python 2.5, FWIW): > > >>> import collections > >>> data = collections.defaultdict(dict) > >>> data['one']['two'] = 'three' > >>> print data > defaultdict(<type 'dict'>, {'one': {'two': 'three'}}) > > [snip] > Your thoughts and comments are very much appreciated. I think my brain > already knows some of the answers, but my heart ... well, perl and I > go way back. Loving python so far, though. > Oh, by the way: That defaultdict route is a pretty solid solution. Not sure what problem you're trying to solve -- depending on your usecase, there might be a better approach. If you're just asking hypothetically and you're trying to apply a Perl idiom to Python, there probably *is* a better solution. /W -- INVALID? DE!
From: MRAB on 5 Mar 2010 21:26 Pete Emerson wrote: > I've been wrestling with dicts. I hope at the very least what I > discovered helps someone else out, but I'm interested in hearing from > more learned python users. > > I found out that adding a two dimensional element without defining > first dimension existing doesn't work: > >>>> data = {} >>>> data['one']['two'] = 'three' > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > KeyError: 'one' >>>> data['one'] = {} >>>> data['one']['two'] = 'three' >>>> print data > {'one': {'two': 'three'}} > > And through some research, I discovered collections.defaultdict (new > in Python 2.5, FWIW): > >>>> import collections >>>> data = collections.defaultdict(dict) >>>> data['one']['two'] = 'three' >>>> print data > defaultdict(<type 'dict'>, {'one': {'two': 'three'}}) > > Why isn't the behavior of collections.defaultdict the default for a > dict? > Am I just revelling in my bad perl habits by not wanting to declare a > previous level first? > Is this sort of "more rigid" way of doing things common throughout > python, and is it best that I not fight it, but embrace it? > > Your thoughts and comments are very much appreciated. I think my brain > already knows some of the answers, but my heart ... well, perl and I > go way back. Loving python so far, though. > Someone once wrote about a case where he was porting a frontend from Perl to Python. It called a backend and parsed the result. Sometimes converting one of the fields to a number would raise a ValueError because it would contain "ERR" instead of a number, which Perl, of course, would silently convert to 0! Python is all about refusing to guess, and complaining if there's an error. :-)
From: Pete Emerson on 5 Mar 2010 21:30 On Mar 5, 6:10 pm, Andreas Waldenburger <use...(a)geekmail.INVALID> wrote: > On Fri, 5 Mar 2010 17:22:14 -0800 (PST) Pete Emerson > > > > > > <pemer...(a)gmail.com> wrote: > > [snip] > > >>> data['one'] = {} > > >>> data['one']['two'] = 'three' > > >>> print data > > {'one': {'two': 'three'}} > > > And through some research, I discovered collections.defaultdict (new > > in Python 2.5, FWIW): > > > >>> import collections > > >>> data = collections.defaultdict(dict) > > >>> data['one']['two'] = 'three' > > >>> print data > > defaultdict(<type 'dict'>, {'one': {'two': 'three'}}) > > > [snip] > > Your thoughts and comments are very much appreciated. I think my brain > > already knows some of the answers, but my heart ... well, perl and I > > go way back. Loving python so far, though. > > Oh, by the way: That defaultdict route is a pretty solid solution. Not > sure what problem you're trying to solve -- depending on your usecase, > there might be a better approach. > > If you're just asking hypothetically and you're trying to apply a > Perl idiom to Python, there probably *is* a better solution. > > /W > > -- > INVALID? DE! I found out about the need to declare the higher level as I was reading in a JSON struct into a dict and then adding a new entry at a lower level. Mostly just proof of concept stuff as I'm learning python. I'm not sure that the use of defaultdict is really warranted for me anywhere just yet. Mostly, I don't want to convert my perl to python, that seems very counterproductive. Thank you very much for your insight. I was a little frightened of doing "import this" ("Hey, kid, run rm - rf / and see what happens!"), but did, and the words are wise. :) Pete
|
Next
|
Last
Pages: 1 2 3 Prev: ANN: Wing IDE 3.2.5 Released Next: Initial RSON prototype parser in subversion |