解析具有要列出的间隔的整数集的字符串

时间:2011-04-18 15:06:56

标签: python string parsing list intervals

我有"2,5,7-9,12"字符串。

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

python中有没有内置函数?

感谢。

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

6 个答案:

答案 0 :(得分:15)

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]

答案 1 :(得分: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

答案 2 :(得分: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]

答案 3 :(得分:2)

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]

答案 4 :(得分:1)

并非我知道,但您可以轻松制作自己的:

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

答案 5 :(得分: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

此解决方案可能需要工作的一个方面是处理负数(从您的问题来看,输入中是否会出现负数并不完全清楚。)