2014-10-14 3 views
0

이 문제를 파악하는 방법에 대한 아이디어가 있지만 많은 양의 데이터로 최적화해야합니다. 나는 각 주마다 모든 값을 찾고 얼마나 자주 나타나는지에 대한 카운터를 갖고 싶다.사전에서 값 확인

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]]} 

나는 각을 확인하는 루프를 만들 수 있습니다 숫자가 이미 상태 안에 있다면 시간이 추가되지만, 각 라인을 추가 할 때 수천 개의 값을 비교해 보면 시간이 많이 걸릴 것입니다.

이것을 최적화하는 가장 좋은 방법은 무엇입니까?

답변

1

collections.defaultdictcollections.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)]} 

바닐라 사전에 (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 

당신을 ' 이제는 자신의 상위 3 명을 찾아야합니다.

+0

이 방법을 사용하여 각 주에서 최상위 모음 만 인쇄 할 수 있습니까? –

+0

'Counter'는'most_common (n)'메소드를 가지고 있습니다. {state : count.most_common (3) for states.content.items()}의 각 주에서 상위 3 개 – jonrsharpe

+0

감사합니다. @ johnrsharpe 지금까지이 작업을 수행했습니다. count = Counter (코스) print 카운트하지만 그 애플 리케이션을 인쇄하고 동결하려고 할 때 잠겨 최대 –

관련 문제