我希望能够将像"1,2,5-7,10“这样的字符串转换成像1,2,5,6,7,10这样的Python列表。我环顾四周,找到了this,但我想知道在Python语言中是否有一种干净而简单的方法来做到这一点。
发布于 2011-06-20 05:32:20
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]
发布于 2011-06-20 06:24:38
这可能有点夸张,但我就是喜欢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')
发布于 2011-06-20 07:59:53
呃,答案太冗长了!以下是一个简短而优雅的答案:
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(',')])
演示:
>>> list( f('1,2,5-7,10') )
[1, 2, 5, 6, 7, 10]
易于修改以处理负数或返回列表。也需要from itertools import chain
,但是如果您不使用range
对象(或sum(map(list,iters),[])
)并且不关心懒惰,那么您可以用sum(...,[])
代替它。
https://stackoverflow.com/questions/6405208
复制相似问题