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

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

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

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

EN

回答 8

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 07:31:58

我能够对这个问题做出一个true的理解:

代码语言:javascript
运行
复制
>>> def f(s):
    return sum(((list(range(*[int(j) + k for k,j in enumerate(i.split('-'))]))
         if '-' in i else [int(i)]) for i in s.split(',')), [])

>>> f('1,2,5-7,10')
[1, 2, 5, 6, 7, 10]

>>> f('1,3-7,10,11-15')
[1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15]

另一个假装理解的答案只是一个for循环,因为最终的列表被丢弃了。:)

对于Python2,您甚至可以删除对list的调用!

票数 6
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提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6405208

复制
相关文章

相似问题

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