检测列表中的连续相同值

1 投票
2 回答
1194 浏览
提问于 2025-04-17 21:41

我有一个数据集,它的结构是一个字典,里面有很多列表,像这样:

{ 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,尤其是要找出有个连续相同值的情况。

举个例子,如果是3,并且这个值是0,那么我会把第一个键值对的UUID放到一个符合条件的UUID列表里,但不会把第二个放进去。

有什么高效的方法可以这样检测连续相同的值吗?

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))]

撰写回答