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:我想用列表理解来实现它,而不是定义额外的功能。
答案 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]
那就是说,这只是为了好玩: