在列表中找到单调序列?

在列表中找到单调序列?,第1张

在列表中找到单调序列

没有循环!至少,没有 明确的 循环…

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)))


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5662677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存