查找列表中差值为1的元素

Ham*_*mad 3 python list

假设我有一个这样的列表:

lst = [1, 3, 4, 5, 8, 10, 14, 20, 21, 22, 23, 40, 47, 48] 
Run Code Online (Sandbox Code Playgroud)

我需要提取相差为一的元素。我需要最终输出如下所示:

[[3, 4, 5], [20, 21, 22, 23], [47, 48]] 
Run Code Online (Sandbox Code Playgroud)

这是我迄今为止针对这个特定问题所做的尝试,它已经取得了一些进展,但没有达到我需要的 100%:

final_list = []
for i in range(len(lst)):
    sub_list = []
    for ii in range(i, len(lst)):
        prev_num = lst[ii-1]
        if lst[ii] - prev_num == 1:
#             print(lst[ii], end=",")
            sub_array.append(lst[ii])
        else:
            break
    if sub_list:
        final_list.append(sub_list)
print(final_list)
Run Code Online (Sandbox Code Playgroud)

输出:

[[4, 5], [5], [21, 22, 23], [22, 23], [23], [48]]
Run Code Online (Sandbox Code Playgroud)

blh*_*ing 6

您可以使用itertools.groupby键函数对项目进行分组,该函数使用增量计数器减去每个项目值,这将导致每组连续整数都有一个固定值:

\n
from itertools import groupby, count\n\nlst = [1, 3, 4, 5, 8, 10, 14, 20, 21, 22, 23, 40, 47, 48]\nc = count()\nfinal_list = [g for _, [*g] in groupby(lst, lambda t: t - next(c)) if len(g) > 1]\n
Run Code Online (Sandbox Code Playgroud)\n

final_list会成为:

\n
[[3, 4, 5], [20, 21, 22, 23], [47, 48]]\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:如果您希望获得更好的性能而不是更简洁的代码,您可以查看 @MadPhysicist\ 的答案,它避免了调用生成器函数所产生的开销,以及 @don\'ttalkjustcode\ 的答案,它避免创建列表,直到找到一对连续的数字。结合这两个答案,您将得到一个避免这两种类型开销的解决方案:

\n
out = []\nprev = float(\'inf\')\nfor i in lst:\n    if i - prev != 1:\n        current = None\n    elif current:\n        current.append(i)\n    else:\n        current = [prev, i]\n        out.append(current)\n    prev = i\n
Run Code Online (Sandbox Code Playgroud)\n

使用 @don\'ttalkjustcode\ 的基准代码的示例计时:

\n
2716 \xce\xbcs  Mad_Physicist\n1554 \xce\xbcs  dont_talk_just_code\n1284 \xce\xbcs  Mad_Physicist_x_dont_talk_just_code\n
Run Code Online (Sandbox Code Playgroud)\n

在线尝试一下!

\n

  • 就时间效率和可读性而言,这是最有效的答案。如果我能接受多个答案就好了。 (2认同)