检查字典中的值

时间:2014-10-14 16:09:44

标签: python performance list dictionary append

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

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循环来检查每次附加的东西,但是当我在添加每一行时得到数千个要检查的值时,它会变得很重。

优化此功能的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我会将其构建为collections.defaultdictcollections.Counter个对象。这两个字典子类将查找状态和作业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)]}

用vanilla词典(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

你现在必须自己找到前三名!