没有循环!至少,没有 明确的 循环…
import itertoolsdef process(lst): # Guard clause against empty lists if len(lst) < 1: return lst # use a dictionary here to work around closure limitations state = { 'prev': lst[0], 'n': 0 } def grouper(x): if x < state['prev']: state['n'] += 1 state['prev'] = x return state['n'] return [ list(g) for k, g in itertools.groupby(lst, grouper) ]
用法(适用于Python 2和Python 3):
>>> data = [45,78,120,47,58,50,32,34]>>> print (list(process(data)))[[45, 78, 120], [47, 58], [50], [32, 34]]
开个玩笑,如果您需要将列表中的项目 分组
,则需要
itertools.groupby引起注意。并非总是最简单/最佳的答案-
但值得一试…
编辑: 如果您不喜欢 闭包 -而是更喜欢使用一个 对象 来保存状态,这是一个替代方案:
class process: def __call__(self, lst): if len(lst) < 1: return lst self.prev = lst[0] self.n = 0 return [ list(g) for k, g in itertools.groupby(lst, self._grouper) ] def _grouper(self, x): if x < self.prev: self.n += 1 self.prev = x return self.ndata = [45,78,120,47,58,50,32,34]print (list(process()(data)))
EDIT2: 由于我更喜欢闭包…但是@torek不喜欢 字典 语法,因此这里是相同解决方案的第三种变化:
import itertoolsdef process(lst): # Guard clause against empty lists if len(lst) < 1: return lst # use an object here to work around closure limitations state = type('State', (object,), dict(prev=lst[0], n=0)) def grouper(x): if x < state.prev: state.n += 1 state.prev = x return state.n return [ list(g) for k, g in itertools.groupby(lst, grouper) ]data = [45,78,120,47,58,50,32,34]print (list(process(data)))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)