Job Offer: Python Ninja or Pirate!

Stargaming stargaming at gmail.com
Mon Dec 10 23:07:19 EST 2007


On Mon, 10 Dec 2007 19:27:43 -0800, George Sakkis wrote:

> On Dec 10, 2:11 pm, Stargaming <stargam... at gmail.com> wrote:
>> On Mon, 10 Dec 2007 16:10:16 +0200, Nikos Vergas wrote:
>>
>> [snip]
>>
>> >> Problem: In the dynamic language of your choice, write a short
>> >> program that will:
>> >>  1. define a list of the following user ids 42346, 77290, 729 (you
>> >>  can
>> >> hardcode these, but it should
>> >> still work with more or less ids)
>> >>  2. retrieve an xml document related to each user at this url
>> >>  "http://
>> >> api.etsy.com/feeds/xml_user_details.php?id="
>> >>  3. retrieve the data contained in the city element from each xml
>> >> document
>> >>  4. keep a running total of how many users are found in each city 5.
>> >>  display the total count of users living in each city
>> [snip]
>>
>> > i wanted to make it a one liner, but i had to import modules :(
>>
>> > import sys, xml, urllib
>>
>> > dummy = [sys.stdout.write(city + ': ' + str(num) + '\n') for city,
>> > num in set([[(a, o.count(a)) for a in p] for o, p in [2*tuple([[city
>> > for city in
>> > ((xml.dom.minidom.parseString(urllib.urlopen('http://api.etsy.com/
feeds/
>>
>> xml_user_details.php?id='
>>
>> > + str(id)).read()).getElementsByTagName('city')[0].childNodes +
>> > [(lambda t: (setattr(t, 'data', 'no city'),
>> > t))(xml.dom.minidom.Text())[1]])[0].data.lower().replace('  ', ' ')
>> > for id in [71234, 71234, 71234, 71234, 71234, 71234,
>> > 42792])]])]][0])]
>>
>> I suggest `__import__` in such cases.
>>
>> Even though I do not qualify for the job, I came up with this (<wink>)
>> code (modified list values for demonstration, mixed together from
>> previous post and original task):
>>
>> print '\n'.join('%s: %d'%(x,len(list(y))) for x,y in __import__
>> ('itertools').groupby(sorted(__import__('xml').dom.minidom.parse
>> (__import__('urllib').urlopen('http://api.etsy.com/feeds/
>> xml_user_details.php?id=%d'%i)).getElementsByTagName('city')
>> [0].lastChild.data.title() for i in (71234, 729, 42346, 77290, 729,
>> 729))))
>>
>> I still find this rather readable, though, and there is no bad side-
>> effect magic! :-)
>>
>> Output should be:
>>
>> | Chicago: 3
>> | Fort Lauderdale: 1
>> | Jersey City And South Florida: 1
>> | New York: 1
> 
> Alas, it's not:
> 
> AttributeError: 'module' object has no attribute 'dom'
> 
> Here's a working version, optimized for char length (one line, 241
> chars):
> 
> import urllib as U,elementtree.ElementTree as
> E;c=[E.parse(U.urlopen('http://api.etsy.com/feeds/xml_user_details.php?
> id=%d'%u)).findtext('//city')for u in
> 71234,729,42346,77290,729,729];print'\n'.join('%s: %s'%
> (i,c.count(i))for i in set(c))
> 
> George

Heh, yes. I did the same error as the participant before me -- test it in 
a premodified environment. A fix is easy, __import__ 'xml.dom.minidom' 
instead of 'xml'. :-)

;-is-cheating'ly yours,



More information about the Python-list mailing list