首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中展开数字块

在Python中展开数字块
EN

Stack Overflow用户
提问于 2015-05-13 04:47:55
回答 3查看 1.8K关注 0票数 9

在我问之前,我用谷歌搜索了一下,但找不到答案。

我的场景是这样的:将一个数字列表传递给脚本,\n-通过文件分隔,或者通过命令行arg以逗号分隔。数字可以是单数,也可以以块为单位,如下所示:

文件:

代码语言:javascript
运行
复制
1
2
3
7-10
15
20-25

命令行参数:

代码语言:javascript
运行
复制
1, 2, 3, 7-10, 15, 20-25

两者最终都在同一个list[]中。我想扩展7-10或20-25块(在实际脚本中,这些数字显然会有所不同),并将它们附加到一个新的列表中,最终列表如下:

代码语言:javascript
运行
复制
['1','2','3','7','8','9','10','15','20','21','22','23','24','25']

我知道像.append(range(7,10))这样的东西可以在这里对我有所帮助,但我似乎找不到原始list[]中哪些元素需要扩展。

所以,我的问题是:给定一个list[]:

代码语言:javascript
运行
复制
['1','2','3','7-10','15','20-25'],

如何获取list[]:

代码语言:javascript
运行
复制
 ['1','2','3','7','8','9','10','15','20','21','22','23','24','25']
EN

回答 3

Stack Overflow用户

发布于 2015-05-13 04:52:36

让我们假设你得到了这个列表:

代码语言:javascript
运行
复制
L = ['1','2','3','7-10','15','20-25']

并且您希望扩展其中包含的所有范围:

代码语言:javascript
运行
复制
answer = []
for elem in L:
    if '-' not in elem:
        answer.append(elem)
        continue
    start, end = elem.split('-')
    answer.extend(map(str, range(int(start), int(end)+1)))

当然,这里有一个很方便的一行代码:

代码语言:javascript
运行
复制
answer = list(itertools.chain.from_iterable([[e] if '-' not in e else map(str, range(*[int(i) for i in e.split('-')]) + [int(i)]) for e in L]))

但这利用了python2.7中泄漏变量的性质,我认为这在python3中不起作用。而且,这不是最具可读性的代码行。所以如果我是你,我不会在生产中使用它...除非你真的恨你的经理。

参考资料:append() continue split() extend() map() range() list() itertools.chain.from_iterable() int()

票数 14
EN

Stack Overflow用户

发布于 2015-05-13 05:06:52

输入:

代码语言:javascript
运行
复制
arg = ['1','2','3','7-10','15','20-25']

输出:

代码语言:javascript
运行
复制
out = []
for s in arg:
    a, b, *_ = map(int, s.split('-') * 2)
    out.extend(map(str, range(a, b+1)))

或者(在Python 2中):

代码语言:javascript
运行
复制
out = []
for s in arg:
    r = map(int, s.split('-'))
    out.extend(map(str, range(r[0], r[-1]+1)))
票数 1
EN

Stack Overflow用户

发布于 2015-05-13 07:15:32

很好的旧map + reduce将会派上用场:

代码语言:javascript
运行
复制
>>> elements = ['1','2','3','7-10','15','20-25']
>>> reduce(lambda original_list, element_list: original_list + map(str, element_list), [[element] if '-' not in element else range(*map(int, element.split('-'))) for element in elements])
['1', '2', '3', '7', '8', '9', '15', '20', '21', '22', '23', '24']

好的,这样就行了,除了你想让20-25也包含25...所以更多的汤来了:

代码语言:javascript
运行
复制
reduce(
    lambda original_list, element_list: original_list + map(str, element_list), 
    [[element] if '-' not in element 
     else range(int(element.split('-')[0]), int(element.split('-')[1]) + 1) 
     for element in elements])

现在,即使这样可以工作,使用一些for循环可能会更好。这就是为什么他们在Python3中删除了reduce的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30201119

复制
相关文章

相似问题

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