gpt4 book ai didi

python - 查找列表中相差 1 的元素

转载 作者:行者123 更新时间:2023-12-04 14:35:13 24 4
gpt4 key购买 nike

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

lst = [1, 3, 4, 5, 8, 10, 14, 20, 21, 22, 23, 40, 47, 48] 
我需要提取差异为 1 的元素。我需要最终输出看起来像这样:
[[3, 4, 5], [20, 21, 22, 23], [47, 48]] 
以下是我迄今为止针对这个特定问题所做的尝试,该问题取得了一些进展,但没有达到我所需要的 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)
输出:
[[4, 5], [5], [21, 22, 23], [22, 23], [23], [48]]

最佳答案

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

from itertools import groupby, count

lst = [1, 3, 4, 5, 8, 10, 14, 20, 21, 22, 23, 40, 47, 48]
c = count()
final_list = [g for _, [*g] in groupby(lst, lambda t: t - next(c)) if len(g) > 1]
final_list会成为:
[[3, 4, 5], [20, 21, 22, 23], [47, 48]]
编辑:如果您希望获得更好的性能而不是更简洁的代码,您可以查看@MadPhysicist 的答案,它避免了调用生成器函数产生的开销,以及@don'ttalkjustcode 的答案,它避免创建列表,直到一对连续的数字是成立。结合这两个答案,您会得到一个避免两种类型开销的解决方案:
out = []
prev = float('inf')
for i in lst:
if i - prev != 1:
current = None
elif current:
current.append(i)
else:
current = [prev, i]
out.append(current)
prev = i
使用@don'ttalkjustcode 的基准代码的示例计时:
2716 μs  Mad_Physicist
1554 μs dont_talk_just_code
1284 μs Mad_Physicist_x_dont_talk_just_code
Try it online!

关于python - 查找列表中相差 1 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69111635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com