Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2013 19:26:16

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

sergeek

Можно ещё abs прописать и с отрицательными корректно будет работать, ну это уже так, если уж очень надо

Я думал, думал и коряво написал :)

Ты юнит тесты делаешь при работе ?



Отредактировано Budulianin (Окт. 27, 2013 19:26:29)

Офлайн

#2 Окт. 27, 2013 19:38:43

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

Budulianin
Можно ещё abs прописать и с отрицательными корректно будет работать, ну это уже так, если уж очень надо
хм, вроде и так ок
Budulianin
Ты юнит тесты делаешь при работе ?
Они очень редко мне подходят, обычно ассертов достаточно. Тут, конечно, совсем лень их было бы делать


Отредактировано sergeek (Окт. 27, 2013 19:39:17)

Офлайн

#3 Окт. 27, 2013 20:38:59

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

lst = [1, 2, 3, 4, 5, 6, 10, 123, 346]
lst.sort()
res = []
tmp = []
for item, nextitem in zip(lst, lst[1:]+[None]):
    tmp.append(item)
    if nextitem is None or nextitem - item != 1:
        if len(tmp) > 1:
            res.append(tmp)
        else:
            res.extend(tmp)
        tmp = []
out = []
for item in res:
    if isinstance(item, list):
        out.append("{}:{}".format(item[0], item[-1]))
    else:
        out.append(str(item))
print ', '.join(out)

EDIT: поправил для работы с отрицательными значениями

Отредактировано bismigalis (Окт. 31, 2013 13:37:03)

Офлайн

#4 Окт. 27, 2013 21:06:32

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

bismigalis
Чётко :)



Офлайн

#5 Окт. 27, 2013 22:18:29

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

сокращение последовательности в строке, re

Budulianin
Ты юнит тесты делаешь при работе ?
если бы он их делал, то сразу бы правильно написал всё
имеется в виду TDD по типу dip3

sergeek
Они очень редко мне подходят, обычно ассертов достаточно.
не смеши, это разные вещи



Отредактировано py.user.next (Окт. 27, 2013 22:26:29)

Офлайн

#6 Окт. 27, 2013 22:45:19

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

py.user.next
если бы он их делал, то сразу бы правильно написал всё

Если только он умеет составлять тесты правильно

Ты что-нибудь знаешь про тест-дизайн ?

Я имел в виду про работу, а не про форум



Офлайн

#7 Окт. 28, 2013 08:46:51

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

py.user.next
не смеши, это разные вещи
Что значит разные? Они оба улучшают корректность программы и в этом контексте они не разные.
py.user.next
если бы он их делал, то сразу бы правильно написал всё
ну вот делать мне нечего больше как для форумных задачек юнит тесты писать

Офлайн

#8 Окт. 28, 2013 18:48:51

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

сокращение последовательности в строке, re

#!/usr/bin/env python3
 
class NotAListError(TypeError):
    pass
 
def convert_any_order(lst):
    """Convert integers in any order to single and range strings."""
    if type(lst) != list:
        raise NotAListError('the argument should be a list')
    if not lst:
        return []
    fmt = '{}:{}'
    lst.sort()
    out = []
    prev, inrange, first = lst[0], False, 0
    for x in lst[1:]:
        if prev + 1 != x:
            if inrange:
                inrange = False
                out.append(fmt.format(first, prev))
            else:
                out.append(str(prev))
        elif not inrange:
            inrange, first = True, prev
        prev = x
    if inrange:
        out.append(fmt.format(first, prev))
    else:
        out.append(str(prev))
    return out

>>> import onegrp
>>> onegrp.convert_any_order([1, 2, 3, 6, 5, 8, 10, -1, -2, -3])
['-3:-1', '1:3', '5:6', '8', '10']
>>>

sergeek
ну вот делать мне нечего больше как для форумных задачек юнит тесты писать
не смеши меня, любой баг в задачке с тестом переделывается в десять раз быстрее, чем без него
у тебя там для пустого списка ошибку индекса выдаёт

Budulianin
Ты что-нибудь знаешь про тест-дизайн ?
нет, не знаю; есть, вообще, книжки, посвящённые составлению тестов
у тебя там много букв

а правильность проверить я не могу, потому что у sergeek'а просто выдаётся строка (даже не список), а у Budulianin'а - тоже разнородный список

у bismigalis'а не работает для отрицательных



Отредактировано py.user.next (Окт. 30, 2013 04:42:16)

Офлайн

#9 Окт. 28, 2013 20:07:12

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

py.user.next
нет, не знаю; есть, вообще, книжки, посвящённые составлению тестов
Нужно знать, чтобы понимать какие тесты составлять и сколько будет достаточно для хорошего покрытия

py.user.next
а правильность проверить я не могу, потому что у sergeek'а просто выдаётся строка (даже не список), а у Budulianin'а - тоже разнородный список

Для проверки достаточно знать ожидаемый результат и фактический, чтобы их сравнить



Офлайн

#10 Окт. 28, 2013 21:49:57

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

сокращение последовательности в строке, re

Budulianin
Нужно знать, чтобы понимать какие тесты составлять и сколько будет достаточно для хорошего покрытия
это надуманно; есть, вообще, общие правила, я их читанул немного в Интернете; летом прошёл юнит-тесты в питоне наполовину (не прошёл моки, а моки дают возможность изображать то, чего нет: типа изобразить, что есть открытый файл, а в нём есть текст, при этом этого файла на самом деле нет)

потом в самом питоне есть много примеров, как можно компактные тесты делать

а вообще, сначала пишешь всё в одном тесте, проверяешь всё подряд; как написал, смотришь, как их можно сгруппировать, группируешь строки; как сгруппировал, разделяешь тест на отдельные тесты - так вырабатываешь свой стиль
а с опытом уже сразу делаешь отдельные тесты
я пока разделяю их на хороший ввод, плохой ввод

Budulianin
Для проверки достаточно знать ожидаемый результат и фактический, чтобы их сравнить
не, я не считаю, что для этого надо писать тест, к моим тестам оно не подходит, потому что они однородные; я мог бы конвертер написать, но просто лень (у тебя там много букв и медленные проверки на исключения), хотя… может, написать?..

я что хочу сказать, ты когда возвращаешь список, в котором чередуются строки и числа, вроде числа и меньше памяти занимают, чем строки, но такой список не очень юзабелен; то есть потом его опять приводить придётся к единому виду, а раз там есть диапазоны, то точно не к числам

проверил твою, написав конвертер (одна строка)
у тебя там несколько ошибок:
[]
[1, 2, 3]
[1, 1, 2, 3]
[-4, -3, -1, 0, 2, 3]

лучше исключения не юзай, они медленные и в данном случае без них можно обойтись



Отредактировано py.user.next (Окт. 28, 2013 21:53:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version