2013-12-18 1 views
4

Мне нужно разобрать строку, которая описывает набор чисел. Номера перечислены в порядке, но диапазон последовательных чисел может быть сокращен с помощью «диапазона», используя дефис/тире.Развернуть строку, описывающую набор чисел, отмеченных как список чисел и/или диапазонов

Пример: «001,008-011,020»

Я хочу, чтобы интерпретировать эту строку, как это упорядоченный список: [ 1, 8, 9, 10, 11, 20 ]

Там может быть произвольное количество диапазонов и элементов.

+4

У вас есть вопрос? Вы сами это пробовали? Что вы придумали? – Floris

ответ

4

Вы могли бы сделать что-то вроде следующего ..

>>> def findval(str): 
...  val = [] 
...  for x in str.split(','): 
...   if '-' in x: 
...   lnum, rnum = x.split('-') 
...   lnum, rnum = int(lnum), int(rnum) 
...   val.extend(range(lnum, rnum + 1)) 
...   else: 
...   lnum = int(x) 
...   val.append(lnum) 
...  return val 

>>> findval('001,008-011,020') 
[1, 8, 9, 10, 11, 20] 

См Working demo

+0

Благодарим вас за быстрый ответ и демонстрацию. – user2724383

3

Реализовать что-то вроде так, захватив диапазон и итерацию на основе целого значения:

str = "001,008-011,020" 
spl = str.split(",") 
output = [] 
for s in spl: 
    if '-' in s: 
     rng = s.split(r"-") 
     for r in range(int(rng[0]), int(rng[1])+1): 
      output.append(r) 
    else: 
     output.append(int(s)) 

print output 

печатает:

[1, 8, 9, 10, 11, 20] 
+0

Вам не хватает последнего числа в диапазоне, я думаю, вы хотите, чтобы int (rng [1]) + 1, иначе вы просто получаете 8,9,10 для диапазона 008-011 – Ffisegydd

+0

После этого был улов, но я переместил его в диапазон. – brandonscript

4

Если вы знаете, что строка всегда будет в таком формате .. .

x = "001,008-011,020" 

x = x.split(',') # Split at the commas 

y = [] 

# Iterate over the list 
for i in x: 
    try: 
     # Will append the integer to your output list 
     y.append(int(i)) 
    except ValueError: 
     # If you get a ValueError (from trying to int('008-011') for example) 
     # then split the string at the hyphen and individually append 
     # the integers in between. 
     j = i.split('-') 
     for k in range(int(j[0]), int(j[1])+1): 
      y.append(k) 

Я думаю, что это должно сработать, хотя вы можете проверить, что никакие другие ValueErrors будут непреднамеренно пойманы в цикле try/except.

3

Как насчет:

def expand(s): 
    parts = (map(int, x.split('-')) for x in s.split(',')) 
    return (n for p in parts for n in range(p[0], p[-1]+1)) 

, после чего

>>> expand("001") 
<generator object <genexpr> at 0x901b784> 
>>> list(expand("001")) 
[1] 
>>> list(expand("001,008-011,020")) 
[1, 8, 9, 10, 11, 20] 
+0

Хороший и короткий ответ (но не так ясно с помощью встроенных контуров). – user2724383

Смежные вопросы