将带区间的整数集合字符串解析为列表

6 投票
6 回答
4089 浏览
提问于 2025-04-16 15:58

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

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

在 Python 里有没有现成的函数可以做到这一点?

谢谢。

更新:我想,直接的答案是 没有。无论如何,感谢你们的“代码片段”。我会使用一个由 Sven Marnach 提出的方案。

6 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

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]
2

这个版本可以处理任意的空格、重叠的范围、顺序不正确的范围,还有负整数:

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]

撰写回答