Dictionary from list?

Jim Correia jim.correia at pobox.com
Fri Oct 19 21:14:46 EDT 2001


In article <slrn9t14si.o5o.quinn at cruzeiro.ugcs.caltech.edu>,
 quinn at cruzeiro.ugcs.caltech.edu (Quinn Dunkan) wrote:

> On Fri, 19 Oct 2001 13:17:54 GMT, Jim Correia <correia at barebones.com> wrote:
> >In article <u8ze8vwhh.fsf at python.net>, Michael Hudson <mwh at python.net> 
> >wrote:
> >
> >> > I'm a python newbie.  I know how to do it "by hand" with a loop, but is 
> >> > there a built in conversion operater that will let me do something 
> >> > simply like the perl assignment?
> >> 
> >> No.  Write the loop.
> >
> >That's unfortunate - a simple assignment would be better.  In the 
> >simplest case of my usage, the loop (while ultra short) could be 50% of 
> >the code.
> 
> This doesn't make any sense to me.  If a two line loop is 50% of your program,
> then your program is four lines.  If you're going to play meaningless
> line-counting games at least come up with some more impressive numbers :)

It was a stupid argument.

> And assignment that uses a heuristic to convert an array into a hash is not
> really "simple".

I'm used to the perl syntax for this operation, and it would be easier 
to type.  That is all.

> import sys
> d = {}
> assert (len(sys.argv)-1) % 2 == 0, \
>     'argv must consist of pairs, key "%s" has no value' % sys.argv[-1]
> for i in range(1, len(sys.argv), 2):
>     d[sys.argv[i]] = sys.argv[i+1]
> 
> for k, v in d.items():
>     print k + ': ' + v

That's what I ended up doing.

> Note that the python version actually checks to make sure the input makes
> sense.  There's no way to know how the perl version reacts to bad input except
> by testing it or reading the documentation.  I suspect perl will silently give
> the last key a nil value, but once again there's no way to know for sure by
> just looking at it.

It fails at runtime with an odd number of elements in hash list error.

> Hopefully you and everyone who reads your code has all
> the little details in the camel book memorized.

I was just asking if there was a built in coercion available.  
(Coercions aren't unheard of in scripting languages.)  This wasn't a my 
language is better than your language war.  I don't have particularly 
strong feelings about perl or python one way or the other (I do most of 
my work in compiled languages - C mostly) but use the right tool, or 
sometimes the convenient tool, for the job.

> This is a good demonstration of why many people prefer the explicit python
> approach.  What if you want bad input to report an error?

There is nothing stopping you from checking and doing that in perl 
either.

> What if you want it to not be an error, but you want the default 
> value to be something other than nil?  What if you start off wanting 
> it to be an error, but later decide it should give a default value?  

I don't see anything stopping you from doing this in perl (or anything 
else for that matter).

> If you wrote this in perl using assignment, you'd have to write a 
> function and then track down all those assignments (have fun checking 
> every assignment in a large program) and replace them with a function 
> call.

But you are ignoring the initial constraints :-).  In this particular 
situation the arguments are passed to the script as key/value pairs.  
The conversion is done at the top of "main" and the dictionary is used 
throughout the rest of the program.

> Learning a new language involves more than learning the syntax and libraries.
> Consider python an opportunity to gain another perspective on the practice of
> programming.

No need to be condescending.  I've got plenty of "practice" and 
experience programming as well as shipping large, complex, high quality 
products to customers.  I didn't ask the question so you can start a 
pissing contest of credentials.

> A two line loop is pretty easy.  If you want to do this a lot then yes, you
> should define a function, in which case 'd = dictconv(a)' is the same number
> of lines than '%d = @a;'.  If you want to quibble, then yes, it's 7 characters
> longer, but consider that you don't have to type '%@;' which reduces the
> difference to 4 characters.

I was looking for the perl conversion because it was easier to type, and 
I didn't have to carry around an extra conversion function (either in an 
external file or by cutting and pasting into otherwise single, one file, 
portable scripts).  That's why a language intrinsic was desired.  Since 
there isn't one, the two line loop will have to suffice.



More information about the Python-list mailing list