首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在范围内获取集的端点

在范围内获取集的端点
EN

Stack Overflow用户
提问于 2011-09-29 16:10:22
回答 2查看 160关注 0票数 0

为了我的生命,我不知道该怎么做。我需要收集与python在一个数字范围内的几个集合的不重叠端点。

例如,用户可以输入范围的10和两组23。我需要在这个范围内得到这些集合的终点,以便:

代码语言:javascript
运行
复制
set 2 groupings: 1-2,6-7
set 3 groupings: 3-5,8-10

任何单个集合的范围、集数和大小都是任意的。我不能超出范围,所以没有半盘。

我一直在想,这应该有一个简单的公式,但我想不出。

编辑

对于范围12的示例输入,并设置1、2和3,输出应如下所示:

代码语言:javascript
运行
复制
set 1: 1,7
set 2: 2-3,8-9
set 3: 4-6,10-12

就像我能想到的,我在看某种累加器的图案。类似于这个psuedo代码:

代码语言:javascript
运行
复制
for each miniRange in range:
    for each set in sets:
        listOfCurrSetEndpoints.append((start, end))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-29 17:55:57

我不认为有一个很好的内置解决方案。(如果有一个与Haskell的scan函数相当的内置函数,就更容易了。)但这是足够简洁的:

代码语言:javascript
运行
复制
>>> import itertools
>>> from collections import defaultdict
>>> partition_lengths = [1, 2, 3]
>>> range_start = 1
>>> range_end = 12
>>> endpoints = defaultdict(list)
>>> for p_len in itertools.cycle(partition_lengths):
...     end = range_start + p_len - 1
...     if end > range_end: break
...     endpoints[p_len].append((range_start, end))
...     range_start += p_len
... 
>>> endpoints
defaultdict(<type 'list'>, {1: [(1, 1), (7, 7)], 2: [(2, 3), (8, 9)], 3: [(4, 6), (10, 12)]})

您现在可以为输出设置endpoints字典的格式。

顺便说一句,我对您在这个问题中使用"set“一词感到非常困惑,这就是为什么我使用”分区“。

票数 2
EN

Stack Overflow用户

发布于 2011-09-29 17:48:24

我对此并不满意,但我确实得到了一个工作计划。如果有人能想出一个更好的答案,我会乐意接受的。

代码语言:javascript
运行
复制
import argparse, sys

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description='Take a number of pages, and the pages in several sets, to produce an output for copy and paste into the print file downloader', version='%(prog)s 2.0')
    parser.add_argument('pages', type=int, help='Total number of pages to break into sets')
    parser.add_argument('stapleset', nargs='+', type=int, help='number of pages in each set')
    args = parser.parse_args()

    data = {}
    for c,s in enumerate(args.stapleset):
        data[c] = []

    currPage = 0
    while currPage <= args.pages:
        for c,s in enumerate(args.stapleset):
            if currPage + 1 > args.pages:
                pass
            elif currPage + s > args.pages:
                data[c].append((currPage+1,args.pages))
            else:
                data[c].append((currPage+1,currPage+s))
            currPage = currPage + s

    for key in sorted(data.iterkeys()):
        for c,t in enumerate(data[key]):
            if c > 0:
                sys.stdout.write(",")
            sys.stdout.write("{0}-{1}".format(t[0],t[1]))
        sys.stdout.write("\n\n")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7600235

复制
相关文章

相似问题

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