首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(代码战争)距离提取

(代码战争)距离提取
EN

Code Review用户
提问于 2019-03-06 08:10:07
回答 1查看 4.9K关注 0票数 6

卡塔:https://www.codewars.com/kata/range-extraction/python

表示整数有序列表的格式是使用逗号分隔的

  • 个别整数
  • 或用破折号分隔起始整数和范围中的结束整数表示的整数范围,“-”。范围包括区间中的所有整数,包括两个端点。它不被认为是一个范围,除非它跨越至少3个数字。例如("12、13、15-17")

完成该解决方案,以便以递增顺序获取整数列表,并以范围格式返回格式正确的字符串。示例:解决方案(-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的礼貌

我的代码

代码语言:javascript
复制
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)
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-03-06 09:17:33

分组

如果您需要使用;groupby可能是最简单的方法

在这里,我们可以使用itertools.groupby食谱对连续的范围进行分组:

代码语言:javascript
复制
>>> 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项,并返回范围。否则,正常返回范围内的所有数字。

我们可以使它成为一个生成器,产生范围或数字,然后将它们连接在一起。

全码

代码语言:javascript
复制
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))
票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/214820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档