首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符串转换为python 3中的数字列表

将字符串转换为python 3中的数字列表
EN

Stack Overflow用户
提问于 2018-03-19 15:06:36
回答 3查看 175关注 0票数 0

This告诉我们如何准备一个数字列表,包括一个连续数或不连续数的范围。

例如,list(range(1,10)) + [20,30,40] + list(range(400,410))将返回[1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 30, 40, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409]

但是,只要输入一个像"1-10, 20, 30, 40, 400-410"这样的字符串,我就能简化它吗?

我可以用for循环编写一个函数来遍历数字。有没有一种更有效的方法来编写函数而不使用for-循环?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-19 15:20:35

您可以使用嵌套列表理解,检查当前部件是否包含-,并使用range或相应地创建一个元素列表:

代码语言:javascript
运行
复制
>>> s = "1-10, 20, 30, 40, 400-410"
>>> [n for part in s.split(", ") for n in (range(*map(int, part.split("-"))) if "-" in part else [int(part)])]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 30, 40, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409]

为了提高可读性,也许可以把它分开:

代码语言:javascript
运行
复制
>>> to_list = lambda part: range(*map(int, part.split("-"))) if "-" in part else [int(part)]
>>> [n for part in s.split(", ") for n in to_list(part)]

注意:与第一个示例一样,这将将"1-10"转换为[1, 2, ..., 9],而不需要10

正如注释中所指出的,对于负数来说,这是行不通的,但是,尝试将-3-4--2拆分成对数字。为此,您可以使用正则表达式..。

代码语言:javascript
运行
复制
>>> def to_list(part):
...     m =re.findall(r"(-?\d+)-(-?\d+)", part)
...     return range(*map(int, m[0])) if m else [int(part)]
...
>>> s = "-10--5, -4, -2-3"
>>> [n for part in s.split(", ") for n in to_list(part)]
[-10, -9, -8, -7, -6, -4, -2, -1, 0, 1, 2]

..。或者对范围使用不同的分隔符,例如-10:-5

票数 1
EN

Stack Overflow用户

发布于 2018-03-19 15:15:04

我建议您编写一个允许创建更复杂、分段范围的函数。

代码语言:javascript
运行
复制
def piecewise_range(*args):
    for arg in args:
        yield from range(*arg)

piecewise_range((1, 10), (20, 50, 10), (400, 410))

然后,函数piecewise_range输出一个生成器,因此它允许您拥有更复杂的范围模式,并保持range的惰性。

票数 0
EN

Stack Overflow用户

发布于 2018-03-19 15:25:36

根据输入字符串的来源,您可以使用类似的方法来命名它:

代码语言:javascript
运行
复制
import re

def gen_nums(input_string):
    out = []
    for item in re.split(r',\s*', input_string):
        if '-' in item:
            start, end = item.split('-')
            out.extend(range(int(start), int(end)))
        else:
            out.append(int(item))
    return out
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49366161

复制
相关文章

相似问题

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