生成器 - 使用 2 个生成器解析数字范围
Generator - parse range of number using 2 generators
所以我有 string
表示由“-”分隔的数字,我需要编写 2 个生成器来获取此字符串和 return 每个数字的范围。
例如输入字符串 '1-2,4-4,8-10'
需要 return:
[1, 2, 4, 8, 9, 10]
所以第一个生成器需要 return 每次迭代的数字列表(可以是字符串列表)所以这就是我所做的:
def parse_ranges(ranges_string):
range_splitter = (n for n in ranges_string.split(','))
print(next(range_splitter).split('-'))
print(next(range_splitter).split('-'))
print(next(range_splitter).split('-'))
这个return:
['1', '2']
['4', '4']
['8', '10']
第二个生成器每次都需要使用这个值和return范围内的所有数字。
所以目前这是我正在尝试的:
numbers = [int(n) for n in list]
这个 return 的数字列表(最小值和最大值),现在我需要将其转换为该范围内的数字。
对于每一对start,end
你需要得到对应的范围[start,end]
,在pythonrange(start, end+1)
def parse_ranges(ranges_string):
result = []
for str_range in ranges_string.split(','):
start, end = str_range.split("-")
result.extend(range(int(start), int(end) + 1))
return result
s = '1-2,4-4,8-10'
x = parse_ranges(s)
print(x) # [1, 2, 4, 8, 9, 10]
你可以试试这个。
def parse_ranges(ranges_string):
l = ranges_string.split(',')
range_list = []
for a in l:
range_list.append(a.split('-'))
return range_list
def to_int(range_list):
out_int = []
for a in range_list:
for a in range(int(a[0]),int(a[1])+1):
out_int.append(a)
return out_int
result = to_int(parse_ranges('1-2,4-4,8-10'))
print(result) # [1, 2, 4, 8, 9, 10]
正如您所说的 生成器 ,您至少需要使用 yield
.
这是我认为您需要的两个生成器:
def singlerange(s):
start, stop = map(int, s.split('-'))
yield from range(start, stop + 1)
def multirange(s):
for rng in s.split(','):
yield from singlerange(rng)
示例运行:
s = '1-2,4-4,8-10'
print(*multirange(s)) # 1 2 4 8 9 10
因为您需要 2 个发电机。如果你想找到 2 个数字之间存在的所有数字,只需使用 list(range(start, end+1))。这将包括开始和结束编号。不过,这不会检查重复范围或 2 个具有相交数字的范围。但这是一个起点
def stringRangetoNumberRange(stringRange):
return [[int(j) for j in x.split('-')] for x in stringRange.split(',')]
def numberRangetoNumberList(numberRange):
result = []
for i in numberRange:
result += list(range(i[0], i[1]+1))
result.sort()
return result
numberRange = stringRangetoNumberRange("1-2,4-4,8-10")
numberList = numberRangetoNumberList(numberRange)
print(numberList)
# [1, 2, 4, 8, 9, 10]
所以我有 string
表示由“-”分隔的数字,我需要编写 2 个生成器来获取此字符串和 return 每个数字的范围。
例如输入字符串 '1-2,4-4,8-10'
需要 return:
[1, 2, 4, 8, 9, 10]
所以第一个生成器需要 return 每次迭代的数字列表(可以是字符串列表)所以这就是我所做的:
def parse_ranges(ranges_string):
range_splitter = (n for n in ranges_string.split(','))
print(next(range_splitter).split('-'))
print(next(range_splitter).split('-'))
print(next(range_splitter).split('-'))
这个return:
['1', '2']
['4', '4']
['8', '10']
第二个生成器每次都需要使用这个值和return范围内的所有数字。
所以目前这是我正在尝试的:
numbers = [int(n) for n in list]
这个 return 的数字列表(最小值和最大值),现在我需要将其转换为该范围内的数字。
对于每一对start,end
你需要得到对应的范围[start,end]
,在pythonrange(start, end+1)
def parse_ranges(ranges_string):
result = []
for str_range in ranges_string.split(','):
start, end = str_range.split("-")
result.extend(range(int(start), int(end) + 1))
return result
s = '1-2,4-4,8-10'
x = parse_ranges(s)
print(x) # [1, 2, 4, 8, 9, 10]
你可以试试这个。
def parse_ranges(ranges_string):
l = ranges_string.split(',')
range_list = []
for a in l:
range_list.append(a.split('-'))
return range_list
def to_int(range_list):
out_int = []
for a in range_list:
for a in range(int(a[0]),int(a[1])+1):
out_int.append(a)
return out_int
result = to_int(parse_ranges('1-2,4-4,8-10'))
print(result) # [1, 2, 4, 8, 9, 10]
正如您所说的 生成器 ,您至少需要使用 yield
.
这是我认为您需要的两个生成器:
def singlerange(s):
start, stop = map(int, s.split('-'))
yield from range(start, stop + 1)
def multirange(s):
for rng in s.split(','):
yield from singlerange(rng)
示例运行:
s = '1-2,4-4,8-10'
print(*multirange(s)) # 1 2 4 8 9 10
因为您需要 2 个发电机。如果你想找到 2 个数字之间存在的所有数字,只需使用 list(range(start, end+1))。这将包括开始和结束编号。不过,这不会检查重复范围或 2 个具有相交数字的范围。但这是一个起点
def stringRangetoNumberRange(stringRange):
return [[int(j) for j in x.split('-')] for x in stringRange.split(',')]
def numberRangetoNumberList(numberRange):
result = []
for i in numberRange:
result += list(range(i[0], i[1]+1))
result.sort()
return result
numberRange = stringRangetoNumberRange("1-2,4-4,8-10")
numberList = numberRangetoNumberList(numberRange)
print(numberList)
# [1, 2, 4, 8, 9, 10]