- Input: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 19]
- Output: "1-10,12,14-16,19"
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
等等。
我仍在学习更多处理列表的Python方式,这个问题对我来说有点困难。我最近的想法是创建一个列表的列表来跟踪成对的数字:
[ [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:]
有没有一种简单的方法可以将这个操作合并到单个迭代中?还有什么其他方法可以使它更具Python风格?
more_itertools.consecutive_groups
工具的演示链接。 - pylang