2011-04-18 49 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]