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

28 投票
8 回答
15544 浏览
提问于 2025-04-16 19:52

我想把一个字符串,比如 "1,2,5-7,10",转换成一个 Python 列表,比如 [1,2,5,6,7,10]。我查了一下,发现了这个,但我在想有没有更简单、更干净的方法来在 Python 中做到这一点。

8 个回答

4

这可能有点过于复杂了,但我就是喜欢用pyparsing这个库:

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')
7

我对这个问题有了一个真正的理解:

>>> 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循环,因为最后的列表被丢弃了。 :)

在Python 2中,你甚至可以去掉对list的调用!

40
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]

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

撰写回答