gpt4 book ai didi

python - 给定多个路径模板,如何将它们合并为一个完整的路径模板

转载 作者:行者123 更新时间:2023-12-04 13:34:01 25 4
gpt4 key购买 nike

不确定标题是否具有描述性,但这是我的问题。给定带有可选参数的路径,例如:

/client/get
/admin/client/get
/admin/client/get/2
我怎么能生成一个模板来表达这个 url 的每个可能版本。例如,它将类似于:
/{admin}/client/get/{id}
我的主要问题是保持路径的顺序。虽然我能够生成包含所有参数的路径,但我似乎无法按正确的顺序进行。产生如下模板:
/client/get/{id}/{admin}
我将 python 列表中的所有路径都作为字符串,没有特定的顺序,如下所示:
/client/get
/admin/client/get/<int:id>
/admin/client/get

最佳答案

可能不是最优化的方法,但我最终在路径部分上关联了权重。从最短的 url 开始,我检测新的部分和删除的部分,然后我假设它们是参数。在最短路径上,我使用 10 的增量来留出我认为合理的空间。 diff 方法只是返回 2 个列表之间的差异。我还在元组中使用了第三个元素来指示参数是否是可选的,允许我添加一个 '?'在模板中。代码不干净,但效果很好:

shortest_string = reduce(lambda a, b: a if len(a) <= len(b) else b, paths)
paths.remove(shortest_string)

shortest = [e for e in shortest_string.split('/') if len(e) > 0]
weighted = [((i + 1) * 10, v, False) for i, v in enumerate(shortest)]

for p in paths:
psplit = [e for e in p.split('/') if len(e) > 0]
new_elements = diff(psplit, shortest)
removed_elements = diff(shortest, psplit)

for w in weighted:
if w[1] in removed_elements:
w[2] = True
if w[1] in psplit:
i = psplit.index(w[1])
psplit[i] = w
for i, ps in enumerate(psplit):
if i < len(psplit) - 2 and isinstance(psplit[i + 1], tuple) and not isinstance(ps, tuple):
psplit[i] = (psplit[i + 1][0] - 1, ps, ps in new_elements)
weighted.append(psplit[i])
elif not isinstance(ps, tuple):
psplit[i] = (psplit[i - 1][0] + 1, ps, ps in new_elements)
weighted.append(psplit[i])

template = '/'.join(['{' + (e[1][1:-1].split(':')[1] if e[1].startswith('<') else e[1]) + ('?' if e[2] else '') + '}'
if e[2] or e[1].startswith('<') else e[1] for e in sorted(weighted, key=lambda x: x[0])[1:]])

关于python - 给定多个路径模板,如何将它们合并为一个完整的路径模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63347252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com