--- Eric <[EMAIL PROTECTED]> wrote: > I have some working code, but I realized it is just > the way I would > write it in C, which means there is probably a > better (more pythonic) > way of doing it. > > Here's the section of code: > > accumulate = firstIsCaps = False > accumStart = i = 0 > while i < len(words): > firstIsCaps = firstIsCapitalized(words[i]) > if firstIsCaps and not accumulate: > accumStart, accumulate = i, True > elif accumulate and not firstIsCaps: > doSomething(words[accumStart : i]) > accumulate = False > i += 1 > > words is a big long array of strings. What I want > to do is find > consecutive sequences of words that have the first > letter capitalized, > and then call doSomething on them. (And you can > ignore the fact that > it won't find a sequence at the very end of words, > that is fine for my > purposes). >
Try out this program: def doSomething(stuff): print stuff def firstIsCapitalized(word): return 'A' <= word[0] <= 'Z' def orig_code(words): print 'C-style' accumulate = firstIsCaps = False accumStart = i = 0 while i < len(words): firstIsCaps = firstIsCapitalized(words[i]) if firstIsCaps and not accumulate: accumStart, accumulate = i, True elif accumulate and not firstIsCaps: doSomething(words[accumStart : i]) accumulate = False i += 1 def another_way(words): print 'more idiomatic, with minor bug fix' group = [] for word in words: if firstIsCapitalized(word): group.append(word) elif group: doSomething(group) group = [] if group: doSomething(group) orig_code(['foo', 'Python', 'Ruby', 'c', 'xxx', 'Perl']) another_way(['foo', 'Python', 'Ruby', 'c', 'xxx', 'Perl']) See also the groupby method in itertools. http://docs.python.org/lib/itertools-functions.html ____________________________________________________________________________________Get the Yahoo! toolbar and be alerted to new email wherever you're surfing. http://new.toolbar.yahoo.com/toolbar/features/mail/index.php -- http://mail.python.org/mailman/listinfo/python-list