首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python3中是否存在递归修改列表和更改其元素的正则表达式?

在python3中是否存在递归修改列表和更改其元素的正则表达式?
EN

Stack Overflow用户
提问于 2020-02-02 10:44:01
回答 4查看 126关注 0票数 0

我有一个字符串列表,格式如下:

代码语言:javascript
运行
复制
["6,7",
"6-8",
"10,12",
"15-18"]

我需要把字符串分割成不同的元素。如果,在那里,我只需要拆分元素。如果-在那里,我需要生成一系列的数字,以包括在两者之间的数字。

示例:'6,7'被拆分为['6','7'],而'6-8'被更改为['6','7','8']

我编写了这个函数,它非常适合这个功能:

代码语言:javascript
运行
复制
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']

我编写了一个关于代码的略为圆润的代码来通过:

代码语言:javascript
运行
复制
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()

有什么更优雅的方法吗?

注:我不知道如何在标题中恰当地列出这个问题。请随意修改。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-02-02 11:11:32

我觉得你们很亲密。不需要审判。我要做的总是用逗号分隔,然后新的部分要么包含一个范围,要么是单个项目。

代码语言:javascript
运行
复制
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')))
票数 3
EN

Stack Overflow用户

发布于 2020-02-02 11:10:42

IMO regex更好,因为str.split可能不会检测到无效输入,例如:",-,-2“。

代码语言:javascript
运行
复制
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']
票数 1
EN

Stack Overflow用户

发布于 2020-02-02 11:17:51

试试这个:

代码语言:javascript
运行
复制
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)

产出:

代码语言:javascript
运行
复制
['6', '7', '6', '7', '8', '10', '12', '15', '16', '17', '18']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60025304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档