最长连续子序列的 Pythonic 方法

大鼠62

我在一个名为“black”的列表中有一个排序的整数列表,我正在寻找一种优雅的方式来获取最长连续子序列的开始“s”和结束“e”(原始问题在 wxh 中有黑色像素-位图,我在给定列 x 中查找最长的行)。我的解决方案有效但看起来很难看:

# blacks is a list of integers generated from a bitmap this way:
# blacks= [y for y in range(h) if bits[y*w+x]==1]

longest=(0,0)
s=blacks[0]
e=s-1
for i in blacks:
    if e+1 == i:   # Contiguous?
        e=i
    else:
        if e-s > longest[1]-longest[0]:
            longest = (s,e)
        s=e=i
if e-s > longest[1]-longest[0]:
    longest = (s,e)
print longest 

我觉得这可以用一个聪明的单线或两线来完成

施沃巴塞尔

您可以使用itertools.groupby执行以下操作itertools.chain

from itertools import groupby, chain
l = [1, 2, 5, 6, 7, 8, 10, 11, 12]
f = lambda x: x[1] - x[0] == 1  # key function to identify proper neighbours

以下仍然几乎可读;-) 并为您提供一个体面的中间步骤,从中以更明智的方式进行可能是一个有效的选择:

max((list(g) for k, g in groupby(zip(l, l[1:]), key=f) if k), key=len)
# [(5, 6), (6, 7), (7, 8)]

为了[5, 6, 7, 8]在一行中提取所需的实际序列,您必须使用更多功夫:

sorted(set(chain(*max((list(g) for k, g in groupby(zip(l, l[1:]), key=f) if k), key=len))))
# [5, 6, 7, 8]

我会让你来研究这个怪物的内部结构 :-) 但请记住:单线通常在短期内令人满意,但从长远来看,更好地选择可读性和代码,你和你的同事- 工人会明白的。可读性是您提到的 Pythonicity 的重要组成部分。

还要注意,这是O(log_N)因为排序。您可以实现应用的一个相同的O(N),涉及例如一个重复的去除技术OrderedDict到输出chain,并保持它O(N),但是这一条线会得到更长的时间。

更新:

其中一种O(N)方法是 DanD. 的建议,它可以使用理解技巧在一行中使用,以避免将中间结果分配给变量:

list(range(*[(x[0][0], x[-1][1]+1) for x in [max((list(g) for k, g in groupby(zip(l, l[1:]), key=f) if k), key=len)]][0]))
# [5, 6, 7, 8]

更漂亮,但是,它不是:D

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

返回字符串中最长单词的Pythonic方法

来自分类Dev

返回字符串中最长单词的Pythonic方法

来自分类Dev

将静态类变量序列化为JSON的Pythonic方法

来自分类Dev

将.py变量保存为序列的Pythonic方法

来自分类Dev

从时间序列数据帧中选择最新值的 Pythonic 方法

来自分类Dev

最“ pythonic”的方法来检查列表的子列表的顺序?

来自分类Dev

替换字符的 Pythonic 方法

来自分类Dev

检查序列是否包含非连续子序列的最快方法?

来自分类Dev

Pythonic单线填充序列

来自分类Dev

将数组切片为连续的连续块的pythonic方法是什么?

来自分类Dev

用Pythonic方法按属性比较两个无序列表的方法

来自分类Dev

从列表中获取所有连续2元组的Pythonic方法

来自分类Dev

在Pandas数据框中迭代两个连续行的Pythonic方法是什么?

来自分类Dev

将字符串拆分为连续、重叠的单词列表的最pythonic 方法是什么

来自分类Dev

获取列表中任意 2 个连续元素之间的最大差异的 Pythonic 方法

来自分类Dev

嵌套函数的更多pythonic方法

来自分类Dev

子类化OpenerDirector的Pythonic方法

来自分类Dev

pythonic索引对象列表的方法

来自分类Dev

最Pythonic的输入验证方法

来自分类Dev

传递许多参数的Pythonic方法

来自分类Dev

编写constrain()函数的pythonic方法

来自分类Dev

类参数验证的Pythonic方法

来自分类Dev

继承许多类的Pythonic方法?

来自分类Dev

用序列中的列表值创建字典的最简洁(最Pythonic)方法是什么?

来自分类Dev

用序列中的列表值创建字典的最简洁(最Pythonic)方法是什么?

来自分类Dev

用Pythonic方法用相同大小的数组替换nan子数组

来自分类Dev

在数组中找到最长的连续子序列

来自分类Dev

向后搜索数组以找到最长的连续子序列

来自分类Dev

具有最大和最小终点的最长连续子序列

Related 相关文章

  1. 1

    返回字符串中最长单词的Pythonic方法

  2. 2

    返回字符串中最长单词的Pythonic方法

  3. 3

    将静态类变量序列化为JSON的Pythonic方法

  4. 4

    将.py变量保存为序列的Pythonic方法

  5. 5

    从时间序列数据帧中选择最新值的 Pythonic 方法

  6. 6

    最“ pythonic”的方法来检查列表的子列表的顺序?

  7. 7

    替换字符的 Pythonic 方法

  8. 8

    检查序列是否包含非连续子序列的最快方法?

  9. 9

    Pythonic单线填充序列

  10. 10

    将数组切片为连续的连续块的pythonic方法是什么?

  11. 11

    用Pythonic方法按属性比较两个无序列表的方法

  12. 12

    从列表中获取所有连续2元组的Pythonic方法

  13. 13

    在Pandas数据框中迭代两个连续行的Pythonic方法是什么?

  14. 14

    将字符串拆分为连续、重叠的单词列表的最pythonic 方法是什么

  15. 15

    获取列表中任意 2 个连续元素之间的最大差异的 Pythonic 方法

  16. 16

    嵌套函数的更多pythonic方法

  17. 17

    子类化OpenerDirector的Pythonic方法

  18. 18

    pythonic索引对象列表的方法

  19. 19

    最Pythonic的输入验证方法

  20. 20

    传递许多参数的Pythonic方法

  21. 21

    编写constrain()函数的pythonic方法

  22. 22

    类参数验证的Pythonic方法

  23. 23

    继承许多类的Pythonic方法?

  24. 24

    用序列中的列表值创建字典的最简洁(最Pythonic)方法是什么?

  25. 25

    用序列中的列表值创建字典的最简洁(最Pythonic)方法是什么?

  26. 26

    用Pythonic方法用相同大小的数组替换nan子数组

  27. 27

    在数组中找到最长的连续子序列

  28. 28

    向后搜索数组以找到最长的连续子序列

  29. 29

    具有最大和最小终点的最长连续子序列

热门标签

归档