python-3.x 高效快速的字典中的字典搜索方法

vc6uscn9  于 2023-02-10  发布在  Python
关注(0)|答案(2)|浏览(163)

所以我有一个工作岗位的法令,每个人都拿着一个法令

{
    "hacker": {"crime": "high"},
    "mugger": {"crime": "high", "morals": "low"},
    "office drone": {"work_drive": "high", "tolerance": "high"},
    "farmer": {"work_drive": "high"},
}

我还有大约21000个不同的工作要做
我怎样才能更快地浏览它们呢?
是否有任何类型的数据结构,使这更快,更好地通过扫描?如查找表的每一个标签?
我用的是python 3.10.4
注意:如果有帮助的话,所有的东西都在运行时开始加载,并且在运行时期间根本不改变
下面是我当前的代码:

test_data = {
    "hacker": {"crime": "high"},
    "mugger": {"crime": "high", "morals": "low"},
    "shop_owner": {"crime": "high", "morals": "high"},
    "office_drone": {"work_drive": "high", "tolerance": "high"},
    "farmer": {"work_drive": "high"},
}

class NULL: pass

class Conditional(object):
    def __init__(self, data):
        self.dataset = data
        
    def find(self, *target, **tags):
        dataset = self.dataset.items()
   
        if target:
            dataset = (
                (entry, data) for entry, data in dataset
                if all( (t in data) for t in target)
                )

        if tags:
            return [
                entry for entry, data in dataset
                if all(
                    (data.get(tag, NULL) == val) for tag, val in tags.items()
                    )
                ]
        else:
             return [data[0] for data in dataset]

jobs = Conditional(test_data)

print(jobs.find(work_drive="high"))
>>> ['office_drone', 'farmer']
print(jobs.find("crime"))
>>> ['hacker', 'mugger', 'shop_owner']
print(jobs.find("crime", "morals"))
>>> ['mugger', 'shop_owner']
print(jobs.find("crime", morals="high"))
>>> ['shop_owner']
ego6inou

ego6inou1#

有没有什么类型的数据结构可以使扫描更快更好?
对,而且叫dict =)
只需将您的dict转换为两个字典,一个按标签,另一个按标签和标签值,其中将包含集合:

from collections import defaultdict

... 

by_tag = defaultdict(set)
by_tag_value = defaultdict(lambda: defaultdict(set))

for job, tags in test_data.items():
    for tag, val in tags.items():
        by_tag[tag].add(job)
        by_tag_value[tag][val].add(job)

# example
# to search crime:high and morals 

crime_high = by_tag_value["crime"]["high"]
morals = by_tag["morals"]
result = crime_high.intersection(morals) # {'mugger', 'shop_owner'}

然后使用它们搜索所需的集合并返回所有集合中存在的作业。

hkmswyz6

hkmswyz62#

当在字典中查找第一级时,可以使用my_dict[key]my_dict.get(key)(它们做同样的事情),所以我认为您只需要使用target查找即可。
然后,如果你想查找哪些作业包含了关于某个标签的任何内容,那么我认为为此是的一个查找字典是合理的,你可以制作一个字典,其中每个键都Map到这些作业的列表。
下面的代码将在开始时运行一次,并基于test_data进行查找。它循环遍历整个字典,每当在项目的值中遇到tag时,它都会将其中的键添加到该标记的作业列表中

lookup = dict()
for k,v in test_data.items():
    for kk,vv in v.items():
         try:
             lookup[kk].append(k)
         except KeyError:
             lookup[kk] = [k]

输出(lookup):

{'crime': ['hacker', 'mugger', 'shop_owner'],
 'morals': ['mugger', 'shop_owner'],
 'work_drive': ['office_drone', 'farmer'],
 'tolerance': ['office_drone']}

使用此查找表,您可以使用lookup['crime']询问“哪些作业具有犯罪统计信息?”,这将输出['hacker', 'mugger', 'shop_owner']

相关问题