根据差异对列表中最近的元素进行分组 [英] Grouping the nearest elements from a list in terms of difference

查看:0
本文介绍了根据差异对列表中最近的元素进行分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个列表:

tst = [1,3,4,6,8,22,24,25,26,67,68,70,72]

我要根据列表中连续元素之间的差异(相差1或2)将上面列表中的元素分组到不同的组/列表中。

如果连续元素之间的差异大于4,则这些元素应形成单独的列表。

以上输入的预期输出为:

[[1, 3, 4, 6, 8], [22, 24, 25, 26], [67, 68, 70, 72]]

我尝试了以下代码,但我认为这不是完美的方法。

def lsp(litt):
    lia = []
    for i in range(len(litt)-1):
        if len(litt)>=2:
            if litt[i+1]-litt[i] >= 4:
                lia.append(litt[i])

    litti = []
    for i in lia:
        if i in litt:
            litti.append(litt.index(i))
    litti.insert(0,0)

    littil = []
    for i in range(len(litti)-1):
        littil.append([litti[i],litti[i+1]])

    t1 = []
    for i,j in enumerate(littil):
        t2 = []
        if i==0:
            t2.append([j[0], j[1]])
        if i!=0:
            t2.append([j[0]+1,j[1]])
        t1.append(t2)
    t1 = [i for j in t1 for i in j]

    fl = []
    for i,j in t1:
        fl.append(litt[i:j+1])
    fl.append(litt[t1[-1][1]+1:])
    return fl

我希望使用itertools.groupby来实现此目的,但不知道如何实现。

推荐答案

我喜欢这种方式,定义一个切片方法并传递一个lambda谓词:

def slice_when(predicate, iterable):
  i, x, size = 0, 0, len(iterable)
  while i < size-1:
    if predicate(iterable[i], iterable[i+1]):
      yield iterable[x:i+1]
      x = i + 1
    i += 1
  yield iterable[x:size]

tst = [1,3,4,6,8,22,24,25,26,67,68,70,72]
slices = slice_when(lambda x,y: y - x > 2, tst)
print(list(slices))
#=> [[1, 3, 4, 6, 8], [22, 24, 25, 26], [67, 68, 70, 72]]

在许多情况下很有用。

这篇关于根据差异对列表中最近的元素进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆