2011-04-18 48 views
5

我有"2,5,7-9,12"字符串。解析字符串的整数集间隔列表

我想从中得到[2,5,7,8,9,12]列表。

python中是否有任何内置函数?

谢谢。

UPD。我想,直接回答是没有。无论如何,感谢您的“片段”。使用一个,由建议Sven Marnach

+0

重复。 http://stackoverflow.com/questions/712460/interpreting-number-ranges-in-python – 2011-04-18 17:16:06

回答

1

This version处理任意的空白,重叠范围,乱序范围内,以及负的整数:

from itertools import chain 

def group_to_range(group): 
    group = ''.join(group.split()) 
    sign, g = ('-', group[1:]) if group.startswith('-') else ('', group) 
    r = g.split('-', 1) 
    r[0] = sign + r[0] 
    r = sorted(int(__) for __ in r) 
    return range(r[0], 1 + r[-1]) 

def rangeexpand(txt): 
    ranges = chain.from_iterable(group_to_range(__) for __ in txt.split(',')) 
    return sorted(set(ranges)) 


>>> rangeexpand('-6,-3--1,3-5,7-11,14,15,17-20') 
[-6, -3, -2, -1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20] 
>>> rangeexpand('1-4,6,3-2, 11, 8 - 12,5,14-14') 
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14] 
1

不,我知道的,但你可以轻松地制作自己:

  1. 创建一个结果列表。
  2. 拆分字符串,并开始迭代结果。
    1. 如果当前字符串包含-将范围追加到列表。
    2. 如果当前字符串是一个数字,请将其附加到列表中。
    3. 否则返回错误。
  3. 返回列表。
+0

有人必须心情不好才能降低所有这些正确的答案。我会把他们带回零:) – 2011-04-18 15:19:04

5
s = "2,5,7-9,12" 
result = list() 

for item in s.split(','): 
    if '-' in item: 
     x,y = item.split('-') 
     result.extend(range(int(x), int(y)+1)) 
    else: 
     result.append(int(item)) 

print result 
+1

为什么downvote?据我所知,这是正确的。 – 2011-04-18 15:15:58

13
s = "2,5,7-9,12" 
ranges = (x.split("-") for x in s.split(",")) 
print [i for r in ranges for i in range(int(r[0]), int(r[-1]) + 1)] 

打印

[2, 5, 7, 8, 9, 12] 
+0

真的很好。我们甚至可以将它合并成一行。 – disfated 2011-04-18 15:29:30

1

我不知道任何内置的功能,将做到这一点的。以下是不是特别优雅,但能够完成任务:

s = "2,5,7-9,12" 
ret = [] 
for tok in s.split(","): 
    val = map(int, tok.split("-")) 
    if len(val) == 1: 
    ret += val 
    else: 
    ret += range(val[0], val[1] + 1) 
print ret 

一个领域是该解决方案可能需要的工作是负数的处理(这是不是从你的问题负数是否能出现完全清楚输入)。

+2

这似乎也是正确的。为什么downvote? – 2011-04-18 15:17:13

+0

在我的情况下,我只需要处理积极的INT,虽然它是好的,有通用的解决方案。 – disfated 2011-04-18 15:35:52

2

我将定义函数:

def make_range(s): 
    out = [] 
    s = s.split(',') 
    for n in s: 
     if '-' in n: 
      n = n.split('-') 
      for i in range(int(n[0]), int(n[1]) + 1): 
       out.append(i) 
     else: 
      out.append(int(n)) 
    return out 

print make_range("2,5,7-9,12") 
#output [2, 5, 7, 8, 9, 12]