Короткая запись множества значений для спецификаций

Главная Форумы Задать вопрос Короткая запись множества значений для спецификаций

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Сообщения
  • #5390 Score: 0
    brichev
    Участник
    1 pt

    Добрый день у меня вопрос к знатокам Python . Кто знает как можно получить из последовательности чисел короткую запись к примеру из списка 1,2,3,4,5,7,8,9 получить запись в виде 1-5,7-9. у меня была мысль использовать нод из видео урока от Khasan Mamaev про уникальные точки, но моих знаний не хватило ни на что(

    #5392 Score: 0
    txt
    Модератор
    86 pts

    Если разделить список только на 2 части (итоговое значение- строка) , то вот дилетантский нод (вы его не применяйте, придут сэнсэи покажут как надо…) для примеру:

    #5393 Score: 0
    brichev
    Участник
    1 pt

    Вот что получилось у меня, но мне кажется это не самое чистое решение, в добавок я не знаю как оно будет работать с несколькими множествами ( в конечном счете мне нужно именно это) Пример: {[1,2,3,4,5,6,8,9,10],[6,7,8,12,13,14]}

     

     

    import clr
    clr.AddReference(‘ProtoGeometry’)
    from Autodesk.DesignScript.Geometry import *
    #Введенные в этом узле данные сохраняется в виде списка в переменных IN.
    dataEnteringNode = IN

    restart = IN[0]
    sts = IN[1]
    tol = IN[2]

    def short(st):
    uniq = []
    while len(st) > 1:
    fff=st[0]
    uniq.append(fff)
    if st[1]-st[0]==tol:
    uniq.append(“-“)

    while st[1]-st[0]==tol:
    st.pop(0)
    else:
    first = st.pop(0)
    second = st[0]

    uniq.append(first)
    uniq.append(“;”)

    else:
    uniq.append(“;”)
    else:
    fffs=st[0]
    uniq.append(fffs)
    return uniq

    #Назначьте вывод переменной OUT.
    OUT = short(sts)

    #5394 Score: 0
    brichev
    Участник
    1 pt

    И так вроде заработло, собрал в пользовательский нод и через list map запустил. и все равно мне кажется. опытные люди найдут более чистое решение 

    #5447 Score: 0
    brichev
    Участник
    1 pt

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

    #5448 Score: 0
    Oleg
    Участник
    28 pts

    Может как-то так?

     

    
    first, last, sublist = IN[0], IN[1], []
    for i,k in zip(first, last):
        if i != k:
            sublist.append(str(i)+"-"+str(k))
        else:
            sublist.append(str(i))
    OUT="; ".join(sublist)
    

     

    #5449 Score: 0
    brichev
    Участник
    1 pt

    Можно и так, только как список чисел разделить на подсписки? на входе имеем  (1,2,3,4,8,9,10,13,14,15,18,20,21) как получить из этого ((1,2,3,4),(8,9,10),(13,14,15),(18),(20,21)). В вашем случае вы сразу создали список с подписками. в моем примере я после создания такого списка использовал flatten для приближения к реальным условиям.

    #5450 Score: 1
    Oleg
    Участник
    28 pts

    Действительно, поторопился)

    Тогда попробуем так:

    #5460 Score: 0
    Khasan Mamaev
    Модератор
    187 pts

    Откуда в итоговом списке взялся диапазон 8-30? И почему нет единички в единственном числе?
    Попробуйте мой код:

    #5465 Score: 1
    Oleg
    Участник
    28 pts

    Откуда в итоговом списке взялся диапазон 8-30? И почему нет единички в единственном числе?

    Потому что в списке остаются только уникальные значения, без дубликатов. Цифра “1” отсутствует в единственном числе, поскольку в списке есть ещё значения 2,3,4, которые и объединяются в запись “1-4”. С значениями 8-30 та же история. В списке присутствовали значения “8, 9, 10, “10..30”, что дает в короткой записи “8-30”

    #5466 Score: 0
    Khasan Mamaev
    Модератор
    187 pts

    ааа, смешали все списки

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Для ответа в этой теме необходимо авторизоваться.