我有以下代码,其中我尝试将范围的字符串表示形式转换为数字列表。例如,如果输入为'0-0,3-5,7-10'
,则期望输出为[0,3,4,5,7,8,9,10]
。但是,我在以下方面有一个错误:
for l,h in r.split('-')
上面写着没有足够的价值来解开。我的推理是,r
应该有表单'x-y'
,所以如果我将它除以'-'
,我应该得到两个值。这有什么问题吗?
def parse_ranges(ranges):
"""Return a list of numbers corresponding to number ranges in a string"""
g = (
(l,h)
for r in ranges.split(',')
for l,h in r.split('-')
)
return (x
for range_tuple in g
for l,h in range_tuple
for x in range(int(l), int(h)+1)
)
parse_ranges('0-5,8-10,11-13')
发布于 2019-07-07 22:32:46
你的循环太多了。因为您试图将这两个数字放在一起,所以不需要第二个嵌套循环。第二种方法是使结果变平:
>>> [x for r in s.split(',') for x in r.split('-')]
['0', '0', '3', '5', '7', '10']
用一个来保持数字成对:
>>> [r.split('-') for r in s.split(',')]
[['0', '0'], ['3', '5'], ['7', '10']]
然后,通过第二次理解,您可以将前两个for
循环组合在一起,方法是打开l
和h
。
return (x
for l,h in g
for x in range(int(l), int(h)+1)
)
发布于 2019-07-07 22:37:59
intspan模块就是这样做的。
import intspan
s = '0-0,3-5,7-10'
>>> list(intspan.intspan(s))
[0, 3, 4, 5, 7, 8, 9, 10]
发布于 2019-07-07 22:34:00
如果您的目标是将具有该格式的字符串解析为一个it列表,那么使用regex解析它可能是值得的。
def parse_ranges(ranges):
"""Return a list of numbers corresponding to number ranges in a string"""
return re.split(',|-', ranges)
parse_ranges('0-5,8-10,11-13')
产出:
['0', '5', '8', '10', '11', '13']
要将它们作为ints,而不是字符串,您可以执行以下操作:
def parse_ranges(ranges):
"""Return a list of numbers corresponding to number ranges in a string"""
return (int(x) for x in re.split(',|-', ranges))
list(parse_ranges('0-5,8-10,11-13'))
产出:
[0, 5, 8, 10, 11, 13]
https://stackoverflow.com/questions/56926573
复制相似问题