栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在列表中找到单调序列?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在列表中找到单调序列?

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

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660718.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号