Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2016 08:23:58

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Диапазон из списка

Всем привет!
Есть очень много длинных списков вида:

[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]
Как, например, из этого, получить диапазоны в виде (21, 49), (65, 94), (109, 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
Но может для этого случая есть какая-нить “волшебная” функция?



Офлайн

#2 Янв. 8, 2016 09:29:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Диапазон из списка

Делали как-то что-то похожее.



Офлайн

#3 Янв. 8, 2016 11:30:59

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Диапазон из списка

Еще похожая задачка. Только результат должен был быть строкой вида ‘21-49, 64-94, 109-138’. Я тогда остановился на варианте terabayt'a

Офлайн

#4 Янв. 8, 2016 16:44:12

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Диапазон из списка

Спасибо!



Офлайн

#5 Янв. 9, 2016 20:56:05

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Диапазон из списка

Посмотрел примеры. Так как в списке не может быть отрицательных значений (данные в списке - это начальная и конечная точка одной из координат) - решил оставить свой вариант с небольшим изменением (по крайней мере, пока не запнусь об ошибку. Теоретический, могут быть небольшие нюансы. Например, если диапазон координат окажется мал, то его надо либо исключить, либо объединить с ближайшей координатной. В общем, больше тестов надо.):

# 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
И небольшое уточнение - мне нужно для 2,7 (Тут был только что какой-то пример с “itertools.izip_longest”, а это я так понял для 3. В общем, не смог его даже попробовать)



Офлайн

#6 Янв. 10, 2016 02:20:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Диапазон из списка

degid
Тут был только что какой-то пример с “itertools.izip_longest”, а это я так понял для 3. В общем, не смог его даже попробовать
Этот для второго питона.
Во втором функция называется izip_longest(), а в третьем - zip_longest().



Офлайн

#7 Янв. 10, 2016 06:25:16

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Диапазон из списка

py.user.next
Понял, не правильно import делал



Офлайн

#8 Янв. 10, 2016 07:21:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Диапазон из списка

Это твой код в виде функции.

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version