将给定的字符串数组范围转换为数字



我从一个废弃的STAAD Pro中获得了以下数组。输入文件。

我想用实际范围替换TO

数组项示例:

[["638TO640"], ["3033", "3038", "4081", "4087"], ["601TO615", "617"]]

我希望这些数组项目变成什么:

[[638, 639, 640], [3033, 3038, 4081, 4087], [601, 602, 603, 604,... 615, 617]]

有没有一种简单的蟒蛇方式来实现转换?

只需使用正则表达式解析字符串中的两个数字,并创建一个range对象:

import re
def str_to_range(s):
begin, end = re.match(r'(d+)TO(d+)', s).groups()
return list(range(int(begin), int(end) + 1))
>>> str_to_range('638TO640')
[638, 639, 640]
mylist = [
["638TO640"],
["638TO6400"],
["3033", "3038", "4081", "4087"],
["601TO615", "617"],
]

def expand_range(str_numbers):
numbers = []
for num in str_numbers:
try:
numbers.append(int(num))
except ValueError:
start, end = num.split("TO")
numbers.extend(range(int(start), int(end) + 1))
return numbers

new_list = [expand_range(sublist) for sublist in mylist]

输出:

[
[638, 639, 640],
[3033, 3038, 4081, 4087],
[601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 617],
]

您只需要一些简单的字符串处理:

from typing import List
from itertools import chain
def range_to_numbers(staad_list: List[List[str]])-> List[List[int]]:
new_list = []
for slist in staad_list:
for i in range(len(slist)):
if slist[i].isnumeric(): slist[i] = [int(slist[i])]
elif 'to' in slist[i].strip().lower():
try:
to_idx = slist[i].lower().find('to')
start, end = int(slist[i][:to_idx]), int(slist[i][to_idx+2:])
slist[i] = [i for i in range(start, end)]
except ValueError: print('Invalid key'); exit()
new_list.append(list(chain(*slist)))
return new_list
# run it with range_to_numbers(your_array)

最新更新