Поиск совпадающих атрибутов
Мои специальные объекты имеют один список значений атрибутов (то есть меняющийся список сокращенных строк коротких, но разной длины, означающих некоторые возможности любого объекта) →
['A', 'B', 'AC', 'BC', ...]
запускаю программу, я ищу хотя бы одно существующее совпадение из меняющегося списка поиска →
['BC', 'BP', 'X', ...]
На данный момент я решил это, перебирая каждый элемент списка поиска с помощью
for e in all_elements:
for a in valid_attributes:
if a in e.capabilities:
handle_match(e, a)
Всего за несколько атрибутов и несколько элементов это будет терпимо, если потребуется время, но...
Дальнейшая проблема: получить все a-значения сразу и обработать их в тот же момент, а затем перейти к следующему e-элементу.
На мгновение я подумал о том, чтобы дать каждому a-значению битовую позицию внутри большого слова шириной в настоящее время около 320 бит и проверить любое вхождение с помощью операции and; другая идея использовать перечисление для атрибутов; но мои попытки пока не увенчались успехом.
У кого-нибудь есть идея лучше и проще? В настоящее время мои полуторагодичные знания Python кажутся недостаточными.
возможности представляют собой строки длиной 1,2 или 3 символа, все строковые значения уникальны как в элементах, так и в действительных атрибутах, «A», «B» и «AB» или «BA» не имеют общих характеристик или значений.
1 ответ
Если атрибуты не повторяются, вы можете вместо этого сохранить их как набор и вычислить пересечение:
for e in all_elements:
if len(valid_attributes.intersection(e.capabilities))>0:
handle_match(e, a)
Или, пожертвовав большим пространством, вы можете сохранить список атрибутов как разреженный двоичный список, где каждый элемент представляет существование некоторого атрибута. Затем вы можете проверять атрибуты в постоянное время.