我知道如何解决这个问题,但我需要用大量数据来优化它。 我非常希望找到每个状态中的所有值,并保持计数器出现的次数。
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循环来检查每次附加的东西,但是当我在添加每一行时得到数千个要检查的值时,它会变得很重。
优化此功能的最佳方法是什么?
答案 0 :(得分:1)
我会将其构建为collections.defaultdict
个collections.Counter
个对象。这两个字典子类将查找状态和作业O(1)
,并表示您不必手动检查struct
或struct[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
你现在必须自己找到前三名!