Series: more general way
Series: more general way
Here is the generic algorithm of determining of the series from sequence by
some feature SeriesFeature. Examples show usage of splitting series in
camelCase strings (in the same case).
from abc import ABCMeta, abstractmethod from itertools import groupby, imap # a,b,c -> ((None, a), (a, b), (b, c)) (ie (prev, cur) pairs) #preiter = lambda it: izip(chain([None], it), it) class SeriesFeature(object): __metaclass__ = ABCMeta id = None # series id i = 0 # element index def __init__(self, serid): self.i = -1 self.id = serid @abstractmethod def __series__(self, el, serid): """Check element `el` and return new/old series id. `serid` is current series id` """ def __call__(self, el): self.i += 1 self.id = self.__series__(el, self.id) return self.id class CapitalizedSeries(SeriesFeature): def __init__(self): super(CapitalizedSeries, self).__init__(0) def __series__(self, el, serid): if self.i == 0 and el.isupper(): return serid elif el.islower(): return serid else: return (serid + 1)%2 CamelCaseSeries = CapitalizedSeries def iseries(flt, it): series = (el[1] for el in groupby(it, flt())) if isinstance(it, str): return imap(''.join, series) else: return series def camelcaseto(s, func): """Transform each CamelCase-string part with `func(ser)`""" return imap(func, iseries(CamelCaseSeries, s)) ########################## test ############################################## print list(iseries(CapitalizedSeries, 'AaaaBbbCcAaa')) print list(iseries(CapitalizedSeries, 'abcDefGhi')) print ' '.join(camelcaseto("noSuchUserError", str.lower)).capitalize()