Pythonic infinite for loop?

Ryan Kelly ryan at rfk.id.au
Thu Apr 14 22:34:17 EDT 2011


On Fri, 2011年04月15日 at 12:10 +1000, Chris Angelico wrote:
> Apologies for interrupting the vital off-topic discussion, but I have
> a real Python question to ask.
>> I'm doing something that needs to scan a dictionary for elements that
> have a particular beginning and a numeric tail, and turn them into a
> single list with some processing. I have a function parse_kwdlist()
> which takes a string (the dictionary's value) and returns the content
> I want out of it, so I'm wondering what the most efficient and
> Pythonic way to do this is.
>> My first draft looks something like this. The input dictionary is
> called dct, the output list is lst.
>> lst=[]
> for i in xrange(1,10000000): # arbitrary top, don't like this
> try:
> lst.append(parse_kwdlist(dct["Keyword%d"%i]))
> except KeyError:
> break
>> I'm wondering two things. One, is there a way to make an xrange object
> and leave the top off? (Sounds like I'm risking the numbers
> evaporating or something.)

There is, use an infinite generator:
 def ints_from(start):
 while True:
 yield start
 start += 1
 for i in ints_from(1):
 ..etc...
But why not just put the while loop inline:
 i = 0
 while True:
 try:
 ...etc...
 except KeyError:
 break
 i += 1
It might be even easier to just iterate through the dictionary keys:
 for k in sorted(dct.keys()):
 if k.startswith("Keyword"):
 lst.append(parse_kwdlist(dct[k]))
> And two, can the entire thing be turned
> into a list comprehension or something? Generally any construct with a
> for loop that appends to a list is begging to become a list comp, but
> I can't see how to do that when the input comes from a dictionary.

You probably could, but I think it would hurt readability in this case:
 lst = [parse_kwdlist(dct[k]) for k in sorted(dct.keys())
 if k.startswith("Keyword")]
 Cheers,
 Ryan
-- 
Ryan Kelly
http://www.rfk.id.au | This message is digitally signed. Please visit
ryan at rfk.id.au | http://www.rfk.id.au/ramblings/gpg/ for details
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/python-list/attachments/20110415/9bdbff54/attachment-0001.sig>


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /