Найти - Пользователи
Полная версия: сокращение последовательности в строке, re
Начало » Центр помощи » сокращение последовательности в строке, re
1 2 3 4 5 6 7
Budulianin
sergeek

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

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

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


bismigalis
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: поправил для работы с отрицательными значениями
Budulianin
bismigalis
Чётко :)
py.user.next
Budulianin
Ты юнит тесты делаешь при работе ?
если бы он их делал, то сразу бы правильно написал всё
имеется в виду TDD по типу dip3

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

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

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

Я имел в виду про работу, а не про форум
sergeek
py.user.next
не смеши, это разные вещи
Что значит разные? Они оба улучшают корректность программы и в этом контексте они не разные.
py.user.next
если бы он их делал, то сразу бы правильно написал всё
ну вот делать мне нечего больше как для форумных задачек юнит тесты писать
py.user.next
#!/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'а не работает для отрицательных
Budulianin
py.user.next
нет, не знаю; есть, вообще, книжки, посвящённые составлению тестов
Нужно знать, чтобы понимать какие тесты составлять и сколько будет достаточно для хорошего покрытия

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

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

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

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

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

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

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

лучше исключения не юзай, они медленные и в данном случае без них можно обойтись
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB