我需要将ints列表转换为包含列表中所有范围的字符串。 因此,例如,输出应该是如下:整数列表到范围
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])
关于如何更快地获得这个的任何想法?
属于http://codereview.stackexchange.com/如果它工作 – depperm
看起来是线性时间,假设'join()'在内部实现也是线性时间。你可能能够减少常数因子(例如用C编码),但是没有什么东西可以渐近地变快。 –
对我来说大概需要0.000006秒。这还不够好?它需要多快? –