Krótkie rozwiązanie, które działa bez dodatkowego importu. Akceptuje każdą iterable, sortuje wejść nieposortowane i usuwa duplikaty:
def ranges(nums):
nums = sorted(set(nums))
gaps = [[s, e] for s, e in zip(nums, nums[1:]) if s+1 < e]
edges = iter(nums[:1] + sum(gaps, []) + nums[-1:])
return list(zip(edges, edges))
Przykład:
>>> ranges([2, 3, 4, 7, 8, 9, 15])
[(2, 4), (7, 9), (15, 15)]
>>> ranges([-1, 0, 1, 2, 3, 12, 13, 15, 100])
[(-1, 3), (12, 13), (15, 15), (100, 100)]
>>> ranges(range(100))
[(0, 99)]
>>> ranges([0])
[(0, 0)]
>>> ranges([])
[]
To jest taka sama jak @ dansalmo na solution który znalazłem niesamowite, choć trochę trudne do odczytania i zastosuj (ponieważ nie jest podana jako funkcja).
Należy zauważyć, że można go łatwo zmodyfikować w celu wyplucia "tradycyjnych" otwartych zakresów [start, end)
, np. zmieniając return:
return [(s, e+1) for s, e in zip(edges, edges)]
Zobacz http://stackoverflow.com/questions/2154249/identify-groups-of-continuous-numbers-in-a-list, co wskazuje na http: // docs. python.org/library/itertools.html#examples –
Praca domowa? Pokazujesz nam, co próbujesz, a my zobaczymy, czy możemy zrobić coś lepiej. –
Dziękuję, powinienem był znaleźć to przed pytaniem:/ – James