首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要帮助使用python制作自定义系列集

需要帮助使用python制作自定义系列集
EN

Stack Overflow用户
提问于 2014-02-25 13:38:16
回答 1查看 32关注 0票数 0

我有一张号码表。该列表可以是串联的,也可以是不连续的。因此,我们需要以以下方式输出。

  1. 如果元素是连续的,那么我们需要写开始-最后,例如,8,9,10,11,然后输出是8-11。
  2. 如果任何一组数字不是串联的,那么我们需要写出相同的值,例如,1,3,4,5,7,8,那么输出将是1,3-5,7,8。在这里,1,3 (中间缺少2),因此它将显示为1,3,然后遵循规则1。
  3. 如果只有两个元素是串联的,如1,2或2,3,那么就不需要写1-2或2-3。完全相同(1,2或2,3)就行了。

下面是所有规则的例子。

代码语言:javascript
运行
复制
8,9,10,11 = 8-11
1,2,3,5,7,8,10,11,12,14 = 1-3,5,7,8,10-12,14
1,3,4,5,7,8 = 1,3-5,7,8
1,3,4,5,7,8,9,10 = 1,3-5,7-10
EN

回答 1

Stack Overflow用户

发布于 2014-02-25 13:47:34

你可以用Raymond Hettinger's cluster function

代码语言:javascript
运行
复制
import ast
def cluster(data, maxgap, key=None):
    """Arrange data into groups where successive elements
       differ by no more than *maxgap*

        >>> cluster([1, 6, 9, 100, 102, 105, 109, 134, 139], maxgap=10)
        [[1, 6, 9], [100, 102, 105, 109], [134, 139]]

        >>> cluster([1, 6, 9, 99, 100, 102, 105, 134, 139, 141], maxgap=10)
        [[1, 6, 9], [99, 100, 102, 105], [134, 139, 141]]

    https://stackoverflow.com/a/14783998/190597 (Raymond Hettinger)
    """
    data.sort()
    groups = [[data[0]]]
    for item in data[1:]:
        if key:
            val = key(item, groups[-1])
        else:
            val = abs(item - groups[-1][-1])
        if val <= maxgap:
            groups[-1].append(item)
        else:
            groups.append([item])
    return groups

tests = ['8,9,10,11', '1,2,3,5,7,8,10,11,12,14', '1,3,4,5,7,8', '1,3,4,5,7,8,9,10']

for test in tests:
    groups = cluster(list(ast.literal_eval(test)), maxgap=1)
    result = ','.join(['{}-{}'.format(grp[0],grp[-1]) if len(grp)>1 else str(grp[0])
                       for grp in groups])
    print(result)

收益率

代码语言:javascript
运行
复制
8-11
1-3,5,7-8,10-12,14
1,3-5,7-8
1,3-5,7-10

如果序列不是字符串,那么只需删除对ast.literal_eval的调用即可

代码语言:javascript
运行
复制
groups = cluster(list(test), maxgap=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22015864

复制
相关文章

相似问题

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