python - 统计连续节点出现的长度和连续出现的次数

标签 python list

我有一个列表 r = [1,2,3,None,None,4,None,5] 我想知道 None 出现的次数和长度。这应该给我:

  • [2, 1] 和 2

我写了下面的代码:

#!/usr/bin/env python
def compute_stats():
    r = [1,2,3,None,None,4,None,5]
    length = []
    counter = 0
    i = 0
    while i < len(r):
        if r[i] == None:
            j = i
            l = 0
            while j < len(r) and r[j] == None:   
                l += 1
                j += 1

            length.append(l)
            counter+= 1
            i = j + 1
        else:
            i += 1
    print str(r) +" length: " + str(length) +" counter " + str(counter)



if __name__ == "__main__":
    compute_stats()

作为输出,我得到以下内容

 [1, 2, 3, None, None, 4, None, 5] length: [2, 1] counter 2

代码运行良好。但是在 python 中有更漂亮的方法吗?

最佳答案

使用 itertools.groupby() object对连续的 None 值进行分组,并计算组长度:

[sum(1 for _ in g) for k, g in groupby(input) if k is None]

因为 g 是一个未知长度的迭代器,我使用了 sum() 来避免将它具体化到一个列表中;否则可能会占用大量内存。如果您 100% 确定连续的 None 对象组很小(最多几百个),则可能仅使用 len(list( g)) 代替。

groupby() 的默认行为是生成一组相同的对象,因此 测试的连续对象为真。这非常适合 None 值。对于每个组,生成一个k 和一个依赖迭代器,其中k 设置为公共(public)组对象;如果 kNone,您知道手头有一系列连续的 None 对象。

关于python - 统计连续节点出现的长度和连续出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702001/

相关文章:

python - "Unused import warning"和 pylint

python - 修改Python字典中的列表元素

python - 如何读取两个串联的 JSON 文件?

python - InvalidS3ObjectException : Unable to get object metadata from S3?

java - OnLongClick 停止 OnClick

java - java中根据参数对对象进行排序

c++ - std::list 和 find(),如果使用在列表中查找未找到项目/值,则会出现错误

python - 使用单个索引项的 numpy 子矩阵 3D

c# - 如何将 List<T> 初始化为给定大小(相对于容量)?

list - 值列表 : a proper list must not end with 1 - nQueens