我有一个字符串列表,格式如下:
["6,7",
"6-8",
"10,12",
"15-18"]
我需要把字符串分割成不同的元素。如果,
在那里,我只需要拆分元素。如果-
在那里,我需要生成一系列的数字,以包括在两者之间的数字。
示例:'6,7'
被拆分为['6','7']
,而'6-8'
被更改为['6','7','8']
我编写了这个函数,它非常适合这个功能:
def process_nums(verse_nums_):
if ',' in verse_nums_:
verse_nums = [i for i in map(str.strip,verse_nums_.split(','))]
elif '-' in verse_nums_:
beg_end = [int(i) for i in map(str.strip,verse_nums_.split('-'))]
verse_nums = [i for i in range(beg_end[0],beg_end[1]+1)]
else:
verse_nums = [verse_nums_]
return verse_nums
然而,我被一个字符串卡住了:'6-8,10'
。应该将其更改为['6','7','8','10']
。我可以进行初始分裂以得到['6-8','10']
。
我编写了一个关于代码的略为圆润的代码来通过:
verse_nums = process_nums('6-8,10')
for x in verse_nums:
if '-' in x:
verse_nums.extend(process_nums(x))
verse_nums.pop(verse_nums.index(x))
verse_nums = [int(i) for i in verse_nums].sort()
有什么更优雅的方法吗?
注:我不知道如何在标题中恰当地列出这个问题。请随意修改。
发布于 2020-02-02 11:11:32
我觉得你们很亲密。不需要审判。我要做的总是用逗号分隔,然后新的部分要么包含一个范围,要么是单个项目。
def process_nums(nums):
parts = nums.split(',')
for part in parts:
if '-' in part:
a, b = part.split('-')
yield from (str(i) for i in range(int(a), int(b)+1))
else:
yield part
print(list(process_nums('6-8,10')))
发布于 2020-02-02 11:10:42
IMO regex更好,因为str.split
可能不会检测到无效输入,例如:",-,-2“。
import re
from typing import List
def process(numbers: List[str]) -> List[str]:
output = []
for no_idea_what_this_is in numbers:
for value in no_idea_what_this_is.split(","):
match = re.fullmatch(r"(\d+)-(\d+)", value)
if match:
start = int(match.group(1))
stop = int(match.group(2)) + 1
output.extend([str(i) for i in range(start, stop)])
elif re.fullmatch("\d+", value):
output.append(value)
else:
raise ValueError(f"Unable to parse {value}")
return output
print(process(["4-8,10"]))
# ['4', '5', '6', '7', '8', '10']
发布于 2020-02-02 11:17:51
试试这个:
mylist = ["6,7","6-8","10,12","15-18"]
new_list = []
for i in mylist :
if ',' in i :
splited = i.split(',')
new_list.append(splited[0])
new_list.append(splited[1])
elif '-' in i :
splited = i.split('-')
x = range(int(splited[0]),int(splited[1])+1)
for y in x :
new_list.append(str(y))
print(new_list)
产出:
['6', '7', '6', '7', '8', '10', '12', '15', '16', '17', '18']
https://stackoverflow.com/questions/60025304
复制相似问题