【发布时间】:2011-03-26 15:55:09
【问题描述】:
我有一个整数列表,需要将其解析为范围字符串。
例如:
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
等等。
我还在学习更多处理列表的pythonic方法,这对我来说有点困难。我最近的想法是创建一个跟踪配对数字的列表:
[ [0, 3], [4, 4], [5, 9], [20, 20] ]
然后我可以遍历这个结构,将每个子列表打印为一个范围或单个值。
我不喜欢在两次迭代中执行此操作,但我似乎无法跟踪每次迭代中的每个数字。我的想法是做这样的事情:
这是我最近的尝试。它有效,但我并不完全满意;我一直在想,有一个更优雅的解决方案完全让我无法理解。字符串处理迭代不是最好的,我知道——对我来说现在还很早:)
def createRangeString(zones):
rangeIdx = 0
ranges = [[zones[0], zones[0]]]
for zone in list(zones):
if ranges[rangeIdx][1] in (zone, zone-1):
ranges[rangeIdx][1] = zone
else:
ranges.append([zone, zone])
rangeIdx += 1
rangeStr = ""
for range in ranges:
if range[0] != range[1]:
rangeStr = "%s,%d-%d" % (rangeStr, range[0], range[1])
else:
rangeStr = "%s,%d" % (rangeStr, range[0])
return rangeStr[1:]
有没有一种直接的方法可以将它合并到一个迭代中?我还能做些什么让它更 Pythonic?
【问题讨论】:
-
查看
more_itertools.consecutive_groups工具here 的演示。