搜索匹配的属性
Searching for matching attributes
我的特殊对象有一个属性值列表(这是一个不同的缩写字符串列表,简短但长度不同,表示任何对象的某些功能)→ ['A', 'B', 'AC', 'BC', ...]
运行 我正在从不同的搜索列表中搜索至少一个现有匹配项的程序 → ['BC', 'BP', 'X', ...]
目前,我通过使用 in
操作对每个类似属性列表的操作遍历每个搜索列表元素来解决这个问题:
for e in all_elements:
for a in valid_attributes:
if a in e.capabilities:
handle_match(e, a)
只有少数几个属性和几个元素,需要时间才能忍受,但是...
进一步的问题:一次获取所有 a 值并在同一时刻处理它们,然后继续下一个电子元素。
我想了一下要给每个 a 值一个位在当前大约 320 位宽的大字内的位置,并通过与操作检查是否出现;对属性使用枚举的其他想法;但到目前为止我的尝试还没有成功。
有没有人有更好更简单的主意?目前我 1.5 年的 Python 知识看起来还不够。
capabilties 是长度为 1,2 或 3 个字符的字符串,
所有字符串值在元素和有效属性中都是唯一的,
'A'、'B' 与 'AB' 或 'BA' 没有共同的特征或意义
如果属性不重复,您可以将它们存储为一个集合并计算交集:
for e in all_elements:
if len(valid_attributes.intersection(e.capabilities))>0:
handle_match(e, a)
或者在更大的 space 牺牲下,您可以将属性列表存储为稀疏二进制列表,其中每个元素代表某个属性的存在。然后你可以在恒定时间内检查属性。
如果属性字符串值是唯一的,您可以使用集合通过处理使用集合 &
交集运算符的结果来快速确定哪些是值:
class Element:
def __init__(self, *capabilities):
self.capabilities = set(capabilities)
def __repr__(self):
return f'Element({repr(self.capabilities)})'
VALID_ATTRIBUTES = {'A', 'B', 'AC', 'BC'}
all_elements = [Element('A', 'B'), Element('A', 'AC'), Element(),
Element('D', 'BC')]
def handle_match(e, a):
print(f'handle_match({e=!r}, {a=!r})')
for e in all_elements:
for a in (e.capabilities & VALID_ATTRIBUTES):
handle_match(e, a)
结果:
handle_match(e=Element({'B', 'A'}), a='B')
handle_match(e=Element({'B', 'A'}), a='A')
handle_match(e=Element({'AC', 'A'}), a='AC')
handle_match(e=Element({'AC', 'A'}), a='A')
handle_match(e=Element({'D', 'BC'}), a='BC')
我的特殊对象有一个属性值列表(这是一个不同的缩写字符串列表,简短但长度不同,表示任何对象的某些功能)→ ['A', 'B', 'AC', 'BC', ...]
运行 我正在从不同的搜索列表中搜索至少一个现有匹配项的程序 → ['BC', 'BP', 'X', ...]
目前,我通过使用 in
操作对每个类似属性列表的操作遍历每个搜索列表元素来解决这个问题:
for e in all_elements:
for a in valid_attributes:
if a in e.capabilities:
handle_match(e, a)
只有少数几个属性和几个元素,需要时间才能忍受,但是...
进一步的问题:一次获取所有 a 值并在同一时刻处理它们,然后继续下一个电子元素。
我想了一下要给每个 a 值一个位在当前大约 320 位宽的大字内的位置,并通过与操作检查是否出现;对属性使用枚举的其他想法;但到目前为止我的尝试还没有成功。
有没有人有更好更简单的主意?目前我 1.5 年的 Python 知识看起来还不够。
capabilties 是长度为 1,2 或 3 个字符的字符串, 所有字符串值在元素和有效属性中都是唯一的, 'A'、'B' 与 'AB' 或 'BA' 没有共同的特征或意义
如果属性不重复,您可以将它们存储为一个集合并计算交集:
for e in all_elements:
if len(valid_attributes.intersection(e.capabilities))>0:
handle_match(e, a)
或者在更大的 space 牺牲下,您可以将属性列表存储为稀疏二进制列表,其中每个元素代表某个属性的存在。然后你可以在恒定时间内检查属性。
如果属性字符串值是唯一的,您可以使用集合通过处理使用集合 &
交集运算符的结果来快速确定哪些是值:
class Element:
def __init__(self, *capabilities):
self.capabilities = set(capabilities)
def __repr__(self):
return f'Element({repr(self.capabilities)})'
VALID_ATTRIBUTES = {'A', 'B', 'AC', 'BC'}
all_elements = [Element('A', 'B'), Element('A', 'AC'), Element(),
Element('D', 'BC')]
def handle_match(e, a):
print(f'handle_match({e=!r}, {a=!r})')
for e in all_elements:
for a in (e.capabilities & VALID_ATTRIBUTES):
handle_match(e, a)
结果:
handle_match(e=Element({'B', 'A'}), a='B')
handle_match(e=Element({'B', 'A'}), a='A')
handle_match(e=Element({'AC', 'A'}), a='AC')
handle_match(e=Element({'AC', 'A'}), a='A')
handle_match(e=Element({'D', 'BC'}), a='BC')