У меня есть список целых чисел, которые мне нужно проанализировать в строке диапазонов.
Например:
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
И так далее.
Я все еще изучаю больше питонических способов обработки списков, и мне это немного сложно. Моя последняя мысль заключалась в создании списка списков, который отслеживает парные номера:
[ [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?