如何将给定范围为正数的范围的给定字符串扩展到列表?

问题描述 投票:0回答:3

例如,给定类似'1-3,8-12,17',的字符串列表,我希望它返回类似[1,2,3,8,9,10,11,12,17]的字符串。是python的新手,所以我什至不知道如何开始。

python
3个回答
1
投票

这不是漂亮的代码,但是在这里是:

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()


1
投票

假设发布的示例是唯一的格式,此代码将执行此操作:

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

0
投票

基本上与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的解决方案非常好(我投票赞成)。

© www.soinside.com 2019 - 2024. All rights reserved.