Tips and tricks (Советы и приемы)

Главная Форумы Python Синтаксис и родные библиотеки Python Tips and tricks (Советы и приемы)

Просмотр 8 сообщений - с 61 по 68 (из 68 всего)
  • Автор
    Сообщения
  • #6859 Score: 4
    txt
    Модератор
    86 pts

    как известно, при использовании set(list) мы преобразуем исходный список во множество , то есть элементы становятся неупорядоченными (в сравнении с исходным списком) и уникальными.
    Один из способов сохранить порядок исходного списка с уникальными элементами:
    (для сравнения используем также set):
    inn = [9,8,8,7,5,5,7]
    set=set(inn)
    set_save_order=[ els for indx,els in enumerate(inn) if inn.index(els)==indx ]
    OUT = set, set_save_order

    #6868 Score: 1
    txt
    Модератор
    86 pts

    Ввиду того , что мне подсказали как это сделать, делюсь
    в дополнение к посту #5622 (Получение индексов повторяющихся элементов в отдельных списках ):

    Имеется исходный список:
    lst=[4,2,1,1,2,3]
    Задача: получить на выходе 2 списка:
    1.) Лист (lst_els) с подсписками уникальных элементов (сохранив первоначальный порядок следования элементов);
    2.) Лист (lst_indx) со списком индексов элементов lst_els относительно исходного листа lst.
    Решение:
    lst = [4, 2, 1, 1, 2, 3]
    counted = set()
    lst_els = [[a]*lst.count(a) for a in (x for x in lst if not (x in counted or counted.add(x)))]
    lst_indx = [[i for i, y in enumerate(lst) if y == x[0]] for x in lst_els]
    OUT=lst_els, lst_indx

    На выходе получаем:
    lst_els=[[4],[2,2],[1,1],[3]]
    lst_indx=[[0],[1,4],[2,3],[5]]

    #6869 Score: 1
    Legantmar
    Хранитель
    475 pts

    найти неповторяющиеся элементы в списке, через подсчет их количества

    s = ["a", "b", "d", "e", "b", "d"] # входной список
    OUT = [i for i in set(s) if s.count(i) == 1]

    >>[‘e’, ‘a’]  – на выходе получим нужные элементы (небольшая “засада” в том, что их порядок немного отличается от первоначального)

    Обращаю ваше внимание, что команда s.count(i) – подсчитывает количество вхождений элемента i в списке (листе) s
    т.е. s.count(“b”) выдаст значение 2 (буква b  встречается 2 раза во входном листе)

    #6871 Score: 1
    txt
    Модератор
    86 pts

    + если все-таки важно сохранить порядок то, используя #6859 :

    s = ["a", "b", "d", "e", "b", "d"] # входной список
    def set_save(x):
       return [els for indx,els in enumerate(x) if x.index(els)==indx]
    OUT = [i for i in set_save(s) if s.count(i) == 1]

    >>[‘a’,‘e’]

    p.s. или в одну строку OUT = [i for i in [els for indx,els in enumerate(s) if s.index(els)==indx] if s.count(i) == 1]

    #6873 Score: 1
    Khasan Mamaev
    Модератор
    187 pts

    Есть еще такой вариант
    import sys
    sys.path.append(r’C:\Program Files (x86)\IronPython 2.7\Lib’)

    from collections import Counter
    A = [10, 10, 23, 10, 123, 66, 78, 123]
    print filter(lambda x: x[1] == 1, Counter(A).items())
    #7956 Score: 2
    Legantmar
    Хранитель
    475 pts

    Получаем все элементы по имени категории.
    cat = categories.get_Item(name) # Категория по имени (name) категории, например, “Стены”, “Воздуховоды”
    builtInCategory = System.Enum.ToObject(BuiltInCategory, cat.Id.IntegerValue) # BuiltIn category по категории
    elems = FilteredElementCollector(doc).OfCategory(builtInCategory).WhereElementIsNotElementType().ToElements() # Элементы по BuiltIn category

    #7960 Score: 1
    Legantmar
    Хранитель
    475 pts

    Замена типа элемента через Symbol

    import clr
    clr.AddReference("RevitServices")
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager
    
    doc = DocumentManager.Instance.CurrentDBDocument
    selectElement = IN[0]
    newType = IN[1]
    TransactionManager.Instance.EnsureInTransaction(doc)
    UnwrapElement(selectElement).Symbol = UnwrapElement(newType)
    TransactionManager.Instance.TransactionTaskDone()
    #8400 Score: 1
    Анатолий
    Участник
    37 pts

    Запишу, чтобы не забыть.
    import clr
    clr.AddReference("RevitNodes")
    import Revit
    family=IN[0] # на вход подаем семейство
    familyName=family.Name
    types = family.Types #получение всех типов семейства без подключения каких-либо библиотек
    types = Revit.Elements.Family.ByName(familyName).Types #получение всех типов семейства (по имени семейства) с библиотеками import clr/clr.AddReference("RevitNodes")/import Revit
    elements = []
    for type in types:
    elem = Revit.Elements.FamilyInstance.ByFamilyType(type) #получение всех экземпляров данного семейства (с теми же подключаемыми библиотеками)
    elements.append(elem)
    OUT = elements

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