我从一个刮过的STAAD Pro中得到以下数组。输入文件。
我想用实际范围代替TO。
示例数组项:
[["638TO640"], ["3033", "3038", "4081", "4087"], ["601TO615", "617"]]我希望这些数组项成为:
[[638, 639, 640], [3033, 3038, 4081, 4087], [601, 602, 603, 604,... 615, 617]]是否有一种简单的琵琶转换方法?
发布于 2021-03-12 14:16:18
只需使用正则表达式解析字符串中的两个数字,并创建一个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]发布于 2021-03-12 14:20:31
您所需要的只是一些简单的字符串处理:
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)发布于 2021-03-12 14:38:37
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],
]https://stackoverflow.com/questions/66601447
复制相似问题