首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -从字符串创建集

Python -从字符串创建集
EN

Stack Overflow用户
提问于 2016-08-20 21:56:39
回答 2查看 1.3K关注 0票数 1

我有格式为"1-3 6:10-11 7-9"的字符串,我想从它们创建数字集,如下所示,{1,2,3,6,10,11,7,8,9}

为了从数字范围创建集合,我有以下代码:

代码语言:javascript
运行
复制
def create_set(src):
    lset = []
    if len(src) > 0:
        pos = src.find('-')
        if pos != -1:
            first = int(src[:pos])
            last  = int(src[pos+1:])
        else:
            return [int(src)]  # Only one number
        for j in range (first, last+1): 
            lset.append(j)
        return set(lset)

但是,当':‘出现在字符串中时,我不知道如何正确地对待它。有人能帮我吗?

提前感谢!

编辑:顺便问一下,是否有一种更紧凑的方法来解析这样的字符串,也许使用正则表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-21 08:38:49

编辑:顺便问一下,是否有一种更紧凑的方法来解析这样的字符串,也许使用正则表达式?

也许是一种更清洁(也更有效)的方法:

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

allGroups = re.findall(r"(\d+)(?:-(\d+)|:)", s)
expanded = [range(int(x), (int(x) if y == '' else int(y)) + 1) for x, y in allGroups]
print {x for x in itertools.chain.from_iterable(expanded)}

解释:

匹配所有字符串,如‘a’或'a:‘,并分别返回(a,b)和(a,'')对的列表:

代码语言:javascript
运行
复制
allGroups = re.findall(r"(\d+)(?:-(\d+)|:)", s)

这就产生了:

代码语言:javascript
运行
复制
[('1', '3'), ('6', ''), ('10', '11'), ('7', '9')]

使用列表理解将(x,y)的所有对展开为范围(x,y+ 1)中的全部数字列表,注意将(x,'')情况处理为(x,x+1):

代码语言:javascript
运行
复制
expanded = [range(int(x), (int(x) if y == '' else int(y)) + 1) for x, y in allGroups]

这就产生了:

代码语言:javascript
运行
复制
[[1, 2, 3], [6], [10, 11], [7, 8, 9]]

使用itertools.chain.from_iterable()将列表列表转换为单个可迭代的列表,集合理解将其迭代到最后一组:

代码语言:javascript
运行
复制
print {x for x in itertools.chain.from_iterable(expanded)}

这就产生了:

代码语言:javascript
运行
复制
set([1, 2, 3, 6, 7, 8, 9, 10, 11])
票数 1
EN

Stack Overflow用户

发布于 2016-08-20 22:16:17

像这样的东西可能对你有用:

代码语言:javascript
运行
复制
s = '1-3 6:10-11 7-9'
s = s.replace(':', ' ')
lset = set()
fs = s.split()
for f in fs:
    r = f.split('-')
    if len(r)==1:
        # add a single number
        lset.add(int(r[0]))
    else:
        # add a range of numbers (inclusive of the endpoints)
        lset |= set(range(int(r[0]), int(r[1])+1))
print(lset)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39059029

复制
相关文章

相似问题

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