检查字典中的值

2024-06-16 10:02:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我对如何解决这个问题有一个想法,但我需要用大量的数据来优化它。 我非常希望找到每个状态中的所有值,并保留它们出现次数的计数器

courses = {}

def insertIntoDataStruct(state,job,count,dict):
    if not state in dict: #adds state to list with first job and count
        dict[state] = [[job,count]]
    else:
        dict[state].append([job,count])

insertIntoDataStruct("TX", 214, 1, courses)
insertIntoDataStruct("CA", 3124, 1, courses)
insertIntoDataStruct("TX", 21455, 1, courses)
insertIntoDataStruct("CA", 5124, 1, courses)
insertIntoDataStruct("CA", 5124, 1, courses)

应输出:

{'CA': [[3124, 1], [5124, 1], [5124, 1]], 'TX': [[214, 1], [21455, 1]]}

因此,如果在CA中值5124被加了两次,它应该输出:

{'CA': [[3124, 1], [5124, 2], 'TX': [[214, 1], [21455, 1]]}

如果数字已经在状态中,我可以做一个for循环来检查每次追加的内容,但是当我在添加每一行时得到数千个要检查的值时,它的时间会很长

优化的最佳方法是什么


Tags: 数据if状态defcount计数器notjob
1条回答
网友
1楼 · 发布于 2024-06-16 10:02:17

我会把它构造成^{}^{}对象。这两个字典子类将组成查找状态和作业O(1),这意味着您不必手动检查structstruct[state]中的键—您只需添加count,就好像它已经存在一样

>>> from collections import Counter, defaultdict
>>> def insert_into_data_struct(state, job, count, struct):
    struct[state][job] += count


>>> courses = defaultdict(Counter)
>>> insert_into_data_struct("TX", 214, 1, courses)
>>> insert_into_data_struct("CA", 3124, 1, courses)
>>> insert_into_data_struct("TX", 21455, 1, courses)
>>> insert_into_data_struct("CA", 5124, 1, courses)
>>> insert_into_data_struct("CA", 5124, 1, courses)
>>> courses
defaultdict(<class 'collections.Counter'>, {'CA': Counter({5124: 2, 3124: 1}), 
                                            'TX': Counter({214: 1, 21455: 1})})

注意,为了符合PEP-0008,我已经重命名了函数


要获得每个州的顶级课程,请使用Counter.most_common

>>> {state: count.most_common(3) for state, count in courses.items()}
{'CA': [(5124, 2), (3124, 1)], 'TX': [(214, 1), (21455, 1)]}

要对普通词典(courses = {})执行相同的操作:

def insert_into_data_struct(state, job, count, struct):
    if state not in struct:
        struct[state] = {job: count}
    elif job not in struct[state]:
        struct[state][job] = count
    else:
        struct[state][job] += count

不过,你现在必须自己找到前三名

相关问题 更多 >