例如,给定类似'1-3,8-12,17',
的字符串列表,我希望它返回类似[1,2,3,8,9,10,11,12,17]
的字符串。是python的新手,所以我什至不知道如何开始。
这不是漂亮的代码,但是在这里是:
import numpy as np
np.concatenate([np.arange(int(x[0]), int(x[-1]) + 1)
for x in [i.split('-') for i in a.split(',')]])
Out[104]: array([ 1, 2, 3, 8, 9, 10, 11, 12, 17])
由于您说过您是Python的新手,所以我会提供一些信息。此解决方案使用a)列表理解,b) str.split()
函数,c) numpy.arange()
和d) numpy.concatenate()
。
假设发布的示例是唯一的格式,此代码将执行此操作:
def str2range(instr):
out = list()
for r in instr.split(','):
r = r.split('-')
if len(r) == 2:
out += range(int(r[0]), int(r[1])+1)
elif len(r) == 1:
out.append(int(r[0]))
return out
基本上与Nicolas's answer相同,但不求助于像numpy
这样的重量级第三方软件包:
from itertools import chain
a = '1-3,8-12,17'
print(list(chain.from_iterable(range(int(x[0]), int(x[-1])+1)
for x in (s.split('-') for s in a.split(',')))))
请介意,对于刚接触Python的人来说,这简直是胡言乱语,所以用更简单的工具扩展,更直接的形式就是:
def str2range(a):
res = []
for mayberange in a.split(','):
start, sep, end = mayberange.partition('-')
start = int(start)
if sep: # Tests if - appears in string at all; if it doesn't, both sep and end are empty string
# We have a range; parse the end, and insert all values in the range
res += range(start, int(end) + 1)
else:
# Only a single value, append it by itself
res.append(start)
return res
显然,第二种解决方案与Wim的解决方案大致相同;当我们知道只需要一个分割或不分割时,我发现str.partition
是一个上乘的选择,因为它使我们可以解压缩成有意义的名称(结果始终为三-tuple
),并且提供了一种更便宜的测试方法是否发生拆分(甚至比len
测试便宜)。但是Wim的解决方案非常好(我投票赞成)。