首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中将数字字符串范围转换为列表

如何在Python中将数字字符串范围转换为列表
EN

Stack Overflow用户
提问于 2011-06-20 05:28:28
回答 7查看 11.3K关注 0票数 23

我希望能够将像"1,2,5-7,10“这样的字符串转换成像1,2,5,6,7,10这样的Python列表。我环顾四周,找到了this,但我想知道在Python语言中是否有一种干净而简单的方法来做到这一点。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-20 05:32:20

代码语言:javascript
复制
def f(x):
    result = []
    for part in x.split(','):
        if '-' in part:
            a, b = part.split('-')
            a, b = int(a), int(b)
            result.extend(range(a, b + 1))
        else:
            a = int(part)
            result.append(a)
    return result

>>> f('1,2,5-7,10')
[1, 2, 5, 6, 7, 10]
票数 34
EN

Stack Overflow用户

发布于 2011-06-20 06:24:38

这可能有点夸张,但我就是喜欢pyparsing:

代码语言:javascript
复制
from pyparsing import *

def return_range(strg, loc, toks):
    if len(toks)==1:
        return int(toks[0])
    else:
        return range(int(toks[0]), int(toks[1])+1)
def parsestring(s):
    expr = Forward()
    term = (Word(nums) + Optional(Literal('-').suppress() + Word(nums))).setParseAction(return_range)
    expr << term + Optional(Literal(',').suppress() + expr)
    return expr.parseString(s, parseAll=True)

if __name__=='__main__':
    print parsestring('1,2,5-7,10')
票数 2
EN

Stack Overflow用户

发布于 2011-06-20 07:59:53

呃,答案太冗长了!以下是一个简短而优雅的答案:

代码语言:javascript
复制
def rangeString(commaString):
    def hyphenRange(hyphenString):
        x = [int(x) for x in hyphenString.split('-')]
        return range(x[0], x[-1]+1)
    return chain(*[hyphenRange(r) for r in commaString.split(',')])

演示:

代码语言:javascript
复制
>>> list( f('1,2,5-7,10') )
[1, 2, 5, 6, 7, 10]

易于修改以处理负数或返回列表。也需要from itertools import chain,但是如果您不使用range对象(或sum(map(list,iters),[]))并且不关心懒惰,那么您可以用sum(...,[])代替它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6405208

复制
相关文章

相似问题

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