卡塔:https://www.codewars.com/kata/range-extraction/python
表示整数有序列表的格式是使用逗号分隔的
完成该解决方案,以便以递增顺序获取整数列表,并以范围格式返回格式正确的字符串。示例:解决方案(-6、-3、-2、-1、0、1、3、4、5、7、8、9、10、11、14、15、17、18、19、20)#返回"-6,-3,1,3-5,7-11,14,15,17-20“rosettacode.org的礼貌
def solution(lst):
res = []
if lst:
tmp, i, ln = lst[0], 0, len(lst)
while i < ln:
tmp, j = lst[i], i
while j < ln - 1 and lst[j+1] == lst[j]+1:
j += 1
if j - i > 1:
tmp = str(lst[i]) + "-" + str(lst[j])
i = j+1
else:
i = (j if j > i else i+1)
res.append(tmp)
return ",".join(str(x) for x in res)发布于 2019-03-06 09:17:33
如果您需要使用;groupby可能是最简单的方法
在这里,我们可以使用itertools.groupby食谱对连续的范围进行分组:
>>> for _, g in groupby(enumerate(lst), lambda i_x : i_x[0] - i_x[1]):
... print([x for _, x in g])
[-6]
[-3, -2, -1, 0, 1]
[3, 4, 5]
[7, 8, 9, 10, 11]
[14, 15]
[17, 18, 19, 20]现在剩下的就是检查范围中是否有更多的2项,并返回范围。否则,正常返回范围内的所有数字。
我们可以使它成为一个生成器,产生范围或数字,然后将它们连接在一起。
def group_consecutives(lst):
for _, g in groupby(enumerate(lst), lambda i_x : i_x[0] - i_x[1]):
r = [x for _, x in g]
if len(r) > 2:
yield f"{r[0]}-{r[-1]}"
else:
yield from map(str, r)
def range_extraction(lst):
return ','.join(group_consecutives(lst))https://codereview.stackexchange.com/questions/214820
复制相似问题