Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算连续非出现的长度和连续出现的次数_Python_List - Fatal编程技术网

Python 计算连续非出现的长度和连续出现的次数

Python 计算连续非出现的长度和连续出现的次数,python,list,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:

我有一个列表
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()

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

用于对连续的相似项进行分组,并过滤掉那些组键为
而非None的项:

from itertools import groupby

lst = [1,2,3,None,None,4,None,5]
cnt = [len(list(g)) for k, g in groupby(lst) if k is None]
print(cnt, len(cnt))
# [2, 1], 2
使用组合键对连续的
None
值进行分组,并计算组长度:

[sum(1 for _ in g) for k, g in groupby(input) if k is None]
由于
g
是一个长度未知的迭代器,因此我使用
sum()
避免将其具体化到列表中;否则可能会占用大量内存。如果您100%确定连续的
None
对象组很小(最多几百个),那么只使用
len(list(g))
可能会更快

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

from itertools import groupby

r = [1,2,3,None,None,4,None,5]

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