这个数组有code
和collection
,其中X
是一个掩码,可以是“任何数字”:
input_array = [{"code": "XXXX10", "collection": "one"}, {"code": "XXX610", "collection": "two"}, {"code": "XXXX20", "collection": "three"}]
字符串
我想要一个函数,给定任何6位代码,例如000710
返回匹配 best 代码掩码的值(例如one
)。这是我的尝试:
def get_collection_from_code(analysis_code):
for collection in input_array:
actual_code = collection["code"]
mask_to_re = actual_code.replace("X", "[\d\D]")
pattern = re.compile("^" + mask_to_re + "$")
if pattern.match(analysis_code):
print("Found collection '" + str(collection["collection"]) + "' for code: " + str(analysis_code))
return collection["collection"]
res = get_collection_from_code("010610")
print(res)
型
这里的问题是,如果我输入代码010610
(我想返回two
),它返回one
,因为它也首先匹配模式XXXX10
。
为了更好地理解,如果我输入这些值,我希望有这些输出:
010610 > two
010010 > one
123420 > three
型
6条答案
按热度按时间sr4lhrrt1#
你可以遍历整个集合,保存任何匹配的非X部分的长度,然后返回最长的:
字符串
注意我已经保存了所有的匹配,以防你想以任何方式处理它们。否则你可以在每次迭代中检查“最佳”匹配并更新它。
bvhaajcl2#
您可以使用自定义函数来计算匹配的数量
字符串
输出量:
型
omtl5h9j3#
您可以创建变量来跟踪最佳匹配并返回相应的集合。此外,您可以根据代码中的固定位数比较长度以优先考虑匹配。
字符串
vjhs03f74#
对数组进行排序,使第一个匹配是最佳匹配。
字符串
ldioqlga5#
另一个可能的选择是计算
SequenceMatcher
的max
imumratio
:字符串
输出量:
型
中间体:
型
9jyewag06#
如果查询函数
get_collection_from_code
要被多次调用,以 O(1) 时间复杂度执行查询的更有效方法是首先按X
s的数量对输入代码进行排序,将它们加入一个交替模式,每个子模式都包含在一个捕获组中,并创建一个以相同顺序排序的集合列表,这样你就可以简单地使用match中捕获组的索引从给定的输入代码中获得集合:字符串
以便:
型
产出:
型
演示:https://ideone.com/MLFmSY