我有一个列表 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)组对象;如果 k
是 None
,您知道手头有一系列连续的 None
对象。
关于python - 统计连续节点出现的长度和连续出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702001/