首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩大如下范围:"1-3, 6,8-10“到[1,2,3,6,8,9,10]

扩大如下范围:"1-3, 6,8-10“到[1,2,3,6,8,9,10]
EN

Stack Overflow用户
提问于 2013-09-12 08:44:07
回答 7查看 5.1K关注 0票数 6

我试图在我的程序中添加一个选项,允许用户选择他想要做的程序的步骤。

我希望能够解析像"1-3,6,8-10"这样的字符串并获得[1, 2, 3, 6, 8, 9, 10]

您知道Python中是否已经存在这样的东西了吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-12 08:57:22

这个函数按你的要求做。它假定没有使用负数,否则需要进行一些更改来支持这种情况。

代码语言:javascript
运行
复制
def mixrange(s):
    r = []
    for i in s.split(','):
        if '-' not in i:
            r.append(int(i))
        else:
            l,h = map(int, i.split('-'))
            r+= range(l,h+1)
    return r


print mixrange('1-3,6,8-10')
票数 9
EN

Stack Overflow用户

发布于 2013-09-12 09:39:21

一种使用列表理解的方法:

代码语言:javascript
运行
复制
s = "1-3,6,8-10"
x = [ss.split('-') for ss in s.split(',')]
x = [range(int(i[0]),int(i[1])+1) if len(i) == 2 else i for i in x]
print([int(item) for sublist in x for item in sublist])

产出:

代码语言:javascript
运行
复制
[1, 2, 3, 6, 8, 9, 10]
票数 6
EN

Stack Overflow用户

发布于 2013-09-12 09:45:13

没有内置功能,但可以使用xrange和生成器来完成:

代码语言:javascript
运行
复制
from itertools import chain

s = "1-3,6,8-10"
spans = (el.partition('-')[::2] for el in s.split(','))
ranges = (xrange(int(s), int(e) + 1 if e else int(s) + 1) for s, e in spans)
all_nums = chain.from_iterable(ranges) # loop over, or materialse using `list`
# [1, 2, 3, 6, 8, 9, 10]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18759512

复制
相关文章

相似问题

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