首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将复杂字符串('2,3-5,50-60,70')插入列表

将复杂字符串('2,3-5,50-60,70')插入列表
EN

Stack Overflow用户
提问于 2016-09-09 16:29:53
回答 2查看 79关注 0票数 3

络合字符串:'2,3-5,50-52,70‘

所需产出: 2,3,4,5,50,51,52,70

以下是我的尝试和成功

代码语言:javascript
复制
a = '2,3-5,50-52,70'
data = []
[data.extend(range(int(r.split('-')[0]),int(r.split('-')[1])+1)) if r.find('-') != -1 else data.append(int(r)) for r in a.split(',')]
print data

已实现的产出: 2、3、4、5、50、51、52、70

但我的问题是,在列表理解方面有什么方法可以做吗?我的意思是

data = [#perform some processing on a here to get directly output]

而不是预先声明列表data,并保持追加或扩展它。

P.S:我想通过简单的列表理解来实现它,而不需要定义额外的功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-09 16:35:51

龙舌兰人:

代码语言:javascript
复制
a = '2,3-5,50-52,70'
data = sum([[int(x)] if x.isdigit() else list(range(int(x.split('-')[0]),1+int(x.split('-')[1]))) for x in a.split(",")],[])
print(data)

isdigit变体

代码语言:javascript
复制
data = sum([list(range(int(x.split('-')[0]),1+int(x.split('-')[1]))) if "-" in x else [int(x)] for x in a.split(",")],[])

(我使用开始值为[]的sum,它允许“平整”创建的一个级别的列表)

结果:

代码语言:javascript
复制
[2, 3, 4, 5, 50, 51, 52, 70]

也就是说,这只是为了好玩:

  • 不过,我不知道这种表现是否好,因为有很多可以避免的列表创建和拆分调用(实际上,我认为这很糟糕)。
  • 它很容易建造,但很难维护/理解
票数 2
EN

Stack Overflow用户

发布于 2016-09-09 16:41:44

我怀疑单凭一份清单就能做到这一点。不过,您可以滥用sum(),并在一行中做其他可怕的事情:

代码语言:javascript
复制
sum([range(*(2 * map(int, c.split('-')))[:2]) + [int(c.split('-')[-1])] for c in text.split(',')], [])

一种更清洁的方法是使用生成器:

代码语言:javascript
复制
def parse_sequence(text):
    for chunk in text.split(','):
        parts = map(int, chunk.split('-'))

        if len(parts) == 1:
            yield parts[0]
        else:
            for n in xrange(parts[0], parts[1] + 1):
                yield n

请不要一字不差。第二种方法速度是原来的两倍,而且写起来并不难读。没有理由使用第一个。

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

https://stackoverflow.com/questions/39415993

复制
相关文章

相似问题

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