首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3:测试一行中的连续数字

Python 3:测试一行中的连续数字
EN

Stack Overflow用户
提问于 2021-10-08 23:04:08
回答 1查看 40关注 0票数 0

我已经有了一个运行良好的算法,但我希望以另一种方式实现它,以获得个人满足感。

简而言之:我有一些数组obj_level,它是一个布尔掩码,表示对象所在位置的坐标,因此类似于

代码语言:javascript
复制
 obj_level = [ 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 1, 1 ]

我想识别对象的底部和顶部。

首先,我生成一个包含索引的数组,其中对象为非零值obj_idx。如果数组不为空,则将第一个值附加到base

然后我遍历并测试索引+1的值是否等于obj_idx中的下一个对象。如果是,则未找到任何边,请继续。

否则,我找到了一条边,所以我附加到basetop之后。我可以推断,在找到的边上既有顶也有基,因为在我测试obj_idx[i+1]时,obj_idx中有更多的值。

最后,我将最后一个值附加到top,因为如果对象有基,则对象必须有顶。

代码语言:javascript
复制
    base = []
    top = []
    obj_idx = np.flatnonzero(obj_level)
    if obj_idx.size > 0:
        base . append(obj_idx[0])
        for i,idx in enumerate(obj_idx[:-1]):
            if idx+1 == obj_idx[i+1]:
                continue
            else:
                top.append(idx)
                base.append(obj_idx[i+1])
        top.append(obj_idx[-1])

我想用更少的行数来做这件事。类似于:

代码语言:javascript
复制
    base = [
           idx + 1 == obj_idx[i+1] or idx+1
           for i,idx in enumerate(obj_idx[:-1])
           ]
    top =  [
           (idx+1 == obj_idx[i+1] or idx
           for i,idx in enumerate(obj_idx[:-1])
           ]
    np.insert(base,0,obj_idx[0])
    np.insert(top,-1,obj_idx[-1])

但是我最终得到了一个类似于[True, True, 3, True, True]的混合数组

有没有比从混合数组中提取整数更简单的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-08 23:50:03

你可以只使用列表理解中的'if‘子句,就像这里描述的if/else in a list comprehension一样,来过滤源迭代器。例如(我避免使用numpy来连接值,只是为了组成一行程序,但当然它不会改变任何事情):

代码语言:javascript
复制
base = [obj_idx[0]] + [
   obj_idx[i+1] for i in range(1, len(obj_idx)-1) if (obj_idx[i+1] != obj_idx[i] + 1)
   ]
top = [
   obj_idx[i] for i in range(1, len(obj_idx)-1) if (obj_idx[i+1] != obj_idx[i] + 1)
   ] + [obj_idx[-1]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69502481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档