gpt4 book ai didi

python - 如何根据部分字符串匹配来过滤字典?

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:14 25 4
gpt4 key购买 nike

我有一个值字典:

dic = {1: "a1+b+c", 2: "a1+c+v", 3: "a1+z+e", 4: "a2+p+a", 5: "a2+z+v", 6: "a3+q+v", ...} 

我在 Flask 中有一个页面,其中有字典中每个部分字符串值的复选框,例如复选框“a”、“b”、“c”等。在页面上,复选框位于 a1、a2、a3 等组中。

我需要根据所选复选框的值按部分值过滤字典,例如,在a1组中选择“c”时,它将返回:

 1: a1+b+c
2: a1+c+v

当从a2组中选择“z”时,会返回:

 5: "a2+z+v"

产生错误的代码是:

sol = [k for k in dic if 'a1' in k]

有人能指出我正确的方向吗?

最佳答案

您可以使用相当短的函数轻松解决此问题:

def lookup(dct, *args):
for needle in args:
dct = {key: value for key, value in dct.items() if needle in value}
return dct

例如:

>>> dic = {1: "a1+b+c", 2: "a1+c+v", 3: "a1+z+e", 4: "a2+p+a", 5: "a2+z+v", 6: "a3+q+v"}
>>> lookup(dic, "a1", "c")
{1: 'a1+b+c', 2: 'a1+c+v'}
<小时/>

但是,总是需要迭代每个“针”的所有键。如果你有一个辅助字典(我将在这里使用 collections.defaultdict )来存储与一个针匹配的所有键(假设 + 应该是字典中的分隔符),你可以做得更好:

from collections import defaultdict

helperdict = defaultdict(set)
for key, value in dic.items():
for needle in value.split('+'):
helperdict[needle].add(key)

helperdict 现在包含与值的特定部分匹配的所有键:

>>> print(dict(helperdict))
{'z': {3, 5}, 'p': {4}, 'a1': {1, 2, 3}, 'a3': {6}, 'v': {2, 5, 6}, 'a2': {4, 5}, 'e': {3}, 'b': {1}, 'a': {4}, 'c': {1, 2}, 'q': {6}}

并使用 set.intersection允许您快速获取不同组合的所有匹配项:

>>> search = ['a2', 'z']
>>> matches = set.intersection(*[helperdict[needle] for needle in search])
>>> {match: dic[match] for match in matches}
{5: 'a2+z+v'}

它肯定比第一种方法长,并且需要更多的外部内存,但如果您打算执行多个查询,它会快得多。

关于python - 如何根据部分字符串匹配来过滤字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441048/

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