络合字符串:'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:我想通过简单的列表理解来实现它,而不需要定义额外的功能。
发布于 2016-09-09 16:35:51
龙舌兰人:
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]也就是说,这只是为了好玩:
发布于 2016-09-09 16:41:44
我怀疑单凭一份清单就能做到这一点。不过,您可以滥用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请不要一字不差。第二种方法速度是原来的两倍,而且写起来并不难读。没有理由使用第一个。
https://stackoverflow.com/questions/39415993
复制相似问题