簡體   English   中英

檢測列表中連續的相同值

[英]Detect consecutive identical values in list

我有一個組織成列表字典的數據集,例如:

{ 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,我會將第一個key:value對的UUID附加到合格UUID列表中,而不是第二個。

以這種方式檢測連續相同值的最有效方法是什么?

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

您可以使用itertools.groupby通過以下方式獲取給定值的最大連續出現次數:

max(
  filter(
    lambda gr:gr[0]==0,
    groupby(_list)
  ), key=lambda gr:len(list(gr[1]))
)

您可以將len(list())重新應用到結果的第二個參數,或者您可以簡單地調整過濾器以消除連續時間短於預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM