将一个复杂的字符串('2,3-5,50-60,70')分解为就地列表

时间:2016-09-09 16:29:53

标签: python python-2.7 list-comprehension

complexstring:'2,3-5,50-52,70'

需要输出:[2,3,4,5,50,51,52,70]

这是我尝试和成功的原因

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:我想用列表理解来实现它,而不是定义额外的功能。

2 个答案:

答案 0 :(得分:3)

我怀疑用单一列表理解可以做到这一点。你可以滥用sum()并在一行中做其他可怕的事情:

sum([range(*(2 * map(int, c.split('-')))[:2]) + [int(c.split('-')[-1])] for c in text.split(',')], [])

更简洁的方法是使用发电机:

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

请不要在一行中完成。第二种方法的速度是原来的两倍,并且难以读取。没有理由使用第一个。

答案 1 :(得分:2)

Oneliner:

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的变体:

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,它允许“压平”创建的一个级别的列表)

结果:

[2, 3, 4, 5, 50, 51, 52, 70]

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

  • 我不知道性能是否良好,因为有很多列表创建和拆分调用可以避免(实际上我认为这很糟糕)
  • 构建起来相当容易,但很难维护/理解