检测列表中的连续相同值
我有一个数据集,它的结构是一个字典,里面有很多列表,像这样:
{ UUID: [3, 3, 5, 3, 0, 0, 3, 3, 2, 3, 2, 1, 1, 0, 2, 0, 5, 0, 0, 0, 0, 3, 4, 1, 2],
UUID: [1, 2, 3, 1, 0, 0, 2] }
我想找出连续相同的值,特别是0,尤其是要找出有
举个例子,如果
有什么高效的方法可以这样检测连续相同的值吗?
2 个回答
1
你可以使用 itertools.groupby
来找出某个值连续出现的最大次数,方法如下:
max(
filter(
lambda gr:gr[0]==0,
groupby(_list)
), key=lambda gr:len(list(gr[1]))
)
你可以对结果的第二个参数再用 len(list())
来计算长度,或者你也可以直接调整过滤条件,去掉那些连续出现次数少于你想要的结果。
5
使用 itertools.groupby
可以检测连续数字的序列:
uuids = { 'a': [3, 3, 5, 3, 0, 0, 3, 3, 2, 3, 2, 1, 1, 0, 2, 0, 5, 0, 0, 0, 0, 3, 4, 1, 2],
'b': [1, 2, 3, 1, 0, 0, 2]}
from itertools import groupby
def detect_runs_in_dict(d, n=3):
return [uuid for uuid, val in d.items() #in python 2, use .iteritems
if any(len(list(g)) >= n for k,g in groupby(val))]
示例
detect_runs_in_dict(uuids)
Out[28]: ['a']
detect_runs_in_dict(uuids,n=2)
Out[29]: ['a', 'b']
这个方法不限制哪些数字可以组成“序列”——如果你想指定特定的数字,这个也很简单,可以直接添加:
def detect_runs_in_dict(d, n=3, searchval=0):
return [uuid for uuid, val in d.items()
if any(k == searchval and len(list(g)) >= n for k,g in groupby(val))]