gpt4 book ai didi

python - 范围的整数列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:24 26 4
gpt4 key购买 nike

我需要将整数列表转换为包含列表中所有范围的字符串。因此,例如,输出应如下所示:

getIntRangesFromList([1,3,7,2,11,8,9,11,12,15]) -> "1-3,7-9,11-12,15"

因此输入未排序,可能存在重复值。列表的大小范围从一个元素到 4k 个元素。最小值和最大值分别为 1 和 4094。

这是性能关键代码段的一部分。我一直在尝试对此进行优化,但找不到更快的方法。这是我当前的代码:

def _getIntRangesFromList(list):
if (list==[]):
return ''
list.sort()
ranges = [[list[0],list[0]]] # ranges contains the start and end values of each range found
for val in list:
r = ranges[-1]
if val==r[1]+1:
r[1] = val
elif val>r[1]+1:
ranges.append([val,val])
return ",".join(["-".join([str(y) for y in x]) if x[0]!=x[1] else str(x[0]) for x in ranges])

关于如何更快地完成此操作有任何想法吗?

最佳答案

这可能是 itertools 的任务模块。

import itertools

list_num = [1, 2, 3, 7, 8, 9, 11, 12, 15]
groups = (list(x) for _, x in
itertools.groupby(list_num, lambda x, c=itertools.count(): x - next(c)))
print(', '.join('-'.join(map(str, (item[0], item[-1])[:len(item)])) for item in groups))

这将为您提供 1-3、7-9、11-12、15

要了解发生了什么,您可能需要检查 groups 的内容。

import itertools
list_num = [1, 2, 3, 7, 8, 9, 11, 12, 15]

groups = (list(x) for _, x in
itertools.groupby(list_num, lambda x, c=itertools.count(): x - next(c)))
for element in groups:
print('element={}'.format(element))

这将为您提供以下输出。

element=[1, 2, 3]
element=[7, 8, 9]
element=[11, 12]
element=[15]

基本思想是让计数器与数字平行运行。 groupby 将为与计数器当前值具有相同数值距离的数字创建单独的组。

我不知道这在您的 Python 版本上是否更快。你必须自己检查一下。在我的设置中,此数据集速度较慢,但​​元素数量较多时速度较快。

关于python - 范围的整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106236/

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