检测列表中的连续相同值

时间:2014-03-10 20:00:00

标签: python list dictionary

我将数据集组织成列表字典,例如:

{ 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列表,但不会附加到第二个。

以这种方式检测连续相同值的最有效方法是什么?

2 个答案:

答案 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())重新应用于结果的第二个参数,或者您可以简单地调整过滤器以消除连续发生次数少于预期的结果。