Tips and tricks (Советы и приемы)
Главная › Форумы › Python › Синтаксис и родные библиотеки Python › Tips and tricks (Советы и приемы)
- В этой теме 67 ответов, 9 участников, последнее обновление 6 лет, 3 месяца назад сделано Анатолий.
-
АвторСообщения
-
как известно, при использовании 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Ввиду того , что мне подсказали как это сделать, делюсь
в дополнение к посту #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]]найти неповторяющиеся элементы в списке, через подсчет их количества
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 раза во входном листе)+ если все-таки важно сохранить порядок то, используя #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]
Получаем все элементы по имени категории.
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Замена типа элемента через 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()
Запишу, чтобы не забыть.
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 -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.
Comments: 490