Форум сайта python.su
1
Всем привет!
Есть очень много длинных списков вида:
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138]
str_pix = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138] series = [] i = 0 start = str_pix[0] while i != len(str_pix): if i+1 < len(str_pix): if str_pix[i]+1 != str_pix[i+1]: series.append((start, str_pix[i])) start = str_pix[i+1] i+=1 series.append((start, str_pix[i-1])) print series
Офлайн
857
Делали как-то что-то похожее.
Офлайн
16
Еще похожая задачка. Только результат должен был быть строкой вида ‘21-49, 64-94, 109-138’. Я тогда остановился на варианте terabayt'a
Офлайн
1
Спасибо!
Офлайн
1
Посмотрел примеры. Так как в списке не может быть отрицательных значений (данные в списке - это начальная и конечная точка одной из координат) - решил оставить свой вариант с небольшим изменением (по крайней мере, пока не запнусь об ошибку. Теоретический, могут быть небольшие нюансы. Например, если диапазон координат окажется мал, то его надо либо исключить, либо объединить с ближайшей координатной. В общем, больше тестов надо.):
# 2.7 # -*- coding: utf-8 -*- str_pix = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138] series = [] i = 0 start = str_pix[0] while i != len(str_pix) and i+1 < len(str_pix): if str_pix[i]+1 != str_pix[i+1]: series.append((start, str_pix[i])) start = str_pix[i+1] i+=1 series.append((start, str_pix[i])) print series
Офлайн
857
degidЭтот для второго питона.
Тут был только что какой-то пример с “itertools.izip_longest”, а это я так понял для 3. В общем, не смог его даже попробовать
Офлайн
1
py.user.next
Понял, не правильно import делал
Офлайн
857
Это твой код в виде функции.
def f(seq): series = [] if not seq: return series i = 0 start = seq[0] while i != len(seq) and i + 1 < len(seq): if seq[i] + 1 != seq[i + 1]: series.append((start, seq[i])) start = seq[i + 1] i += 1 series.append((start, seq[i])) return series
>>> from ser import f >>> f([]) [] >>> f([1, 2]) [(1, 2)] >>> f([1, 2, 3]) [(1, 3)] >>> f([1, 2, 3, 5, 6, 7]) [(1, 3), (5, 7)] >>> f([1, 2, 3, 5, 6, 7, 10, 11, 12]) [(1, 3), (5, 7), (10, 12)] >>> >>> f([1]) [(1, 1)] >>> f([1, 2, 5]) [(1, 2), (5, 5)]
Отредактировано py.user.next (Янв. 10, 2016 07:24:16)
Офлайн