我将数据集组织成列表字典,例如:
{ 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)的情况,特别是检测 n 连续相同值的实例。
例如,如果 n 为3且值为0,我会将第一个键:值对的UUID附加到符合条件的UUID列表,但不会附加到第二个。
以这种方式检测连续相同值的最有效方法是什么?
答案 0 :(得分: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))]
答案 1 :(得分:1)
您可以使用itertools.groupby
以这种方式获得给定值的最大连续出现次数:
max(
filter(
lambda gr:gr[0]==0,
groupby(_list)
), key=lambda gr:len(list(gr[1]))
)
您可以将len(list())
重新应用于结果的第二个参数,或者您可以简单地调整过滤器以消除连续发生次数少于预期的结果。