2013-07-24 3 views
0

내가 다르게 분석하기 위해 재검토하려고하는 JSON 개체가 있고 두 가지를 기준으로 한 필드를 집계하는 기능적 변환을 찾고 있습니다. 키 입력란.JSON 사전의 파이썬 기능 변환 길어에서 큰로

내 데이터 세트는 다음과 같습니다

myjson = 

[ 
{ 
"name": "Fred", 
"class": "Algebra", 
"topic" : "polynomials", 
"extra" : "True" 
}, 
{ 
"name": "Fred", 
"class": "Algebra", 
"topic" : "polynomial division", 
"extra" : "False" 
}, 
{ 
"name": "Fred", 
"class": "Algebra", 
"topic" : "solving", 
"extra" : "True" 
}, 
{ 
"name": "Willbert", 
"class": "Dance", 
"topic" : "Fancy", 
"extra" : "False" 
}, 
{ 
"name": "Willbert", 
"class": "Dance", 
"topic" : "Country", 
"extra" : "True" 
} 
] 

나는 "추가"필드의 내용이 다른 주제 필드를 --- 집계에 대한 고유 키로 이름과 클래스를 사용하고 싶습니다, I 첫 번째 항목과 관련된 데이터를 유지하기 위해 모든 항목을 좋아합니다. 즉, 병합 할 필요는 없지만 하나의 레코드에서만 값을 가져와야합니다.

그래서,에 위의를 설정하고 싶습니다 :

[ 
{ 
"name": "Fred", 
"class": "Algebra", 
"topic" : ["polynomials","polynomial division","solving"], 
"extra" : "True" 
}, 
{ 
"name": "Willbert", 
"class": "Dance", 
"topic" : ["Fancy","Country"], 
"extra" : "False" 
} 
] 

심지어 문자열로 함께 항목을 연결 :

[ 
{ 
"name": "Fred", 
"class": "Algebra", 
"topic" : "polynomials polynomial division solving" 
}, 
{ 
"name": "Willbert", 
"class": "Dance", 
"topic" : "Fancy Country" 
} 
] 

내가 solved with groupby 전에 한 번 비슷한 질문을했다, 그러나 이것을 시작하는 방법에 대한 손실이 있습니다. 특히 이제는 하나가 아닌 두 개의 키 항목이 있기 때문에 특히 그렇습니다.

UPDATE

나는 하나의 키 날이 예에서 작동하는 시작하는 데 얻을 수

...

groups = itertools.groupby(myjson,lambda x: (x['name'])) 
[(k,list(g)) for k,g in groups] 

하지만 내 실제 데이터 세트의

혼자 '이름'충분하지 않습니다 모호성을 제거하려면 --- '이름'과 '수업'으로 그룹화해야합니다.

이 작동하지 않습니다 :이 정말 필요하다 --- 2 개 그룹에 대한 키잉이 아닌 사소한 제안, 또는 다른 방법 누군가가

groups = itertools.groupby(myjson,lambda x: (x['name'],x['class'])) 
[(k,list(g)) for k,g in groups] 

업데이트 2

Found this link solving a similar problem itertools의 기능 및 장점에 대해 더 많은 경험이 있으면 groupby를 사용하면 더 나은 점을 지적 할 수 있습니까?

+0

이유는 무엇입니까? "여분": 결과의 첫 번째 사전에 "True"? –

+0

데이터 세트에 키가 아니고 특별히 집계해야하는 항목도 있지만 마지막 항목으로 계속 옮겨야하는 필드가 있음을 설명하기 만하면됩니다. – Mittenchops

+0

하지만 "이월 된"것이 아닙니다. "Fred", "Algebra"'에 대한 소스 레코드에서 언젠가는'True'가되고 때로는'False'가됩니다. 그러면 내가 선택할 가치를 어떻게 알 수 있습니까? –

답변

1

일부 키 그룹 사전을 사용할 수

data = {} 
key = operator.itemgetter("name", "class") 
for record in myjson: 
    k = key(record) 
    if k in data: 
     data[k]["topic"].append(record["topic"]) 
    else: 
     data[k] = record.copy() 
     data[k]["topic"] = [record["topic"]] 
result = data.values() 

루프는 "topic" 필드 축적 원하는 키에 의해 키가 사전에, 상기 입력리스트를 변환한다. 값에 키가 포함되므로 값을 추출하여 원하는 결과를 얻을 수 있습니다.

+0

'extra'의 값을 'class'그룹의 각 '이름'에 대한 첫 번째 일치 값과 동일하게 취급하는 것이 상당히 까다로운가요? – Mittenchops

+0

@Mittenchops : 방금 귀하의 의견을보고 솔루션을 업데이트했습니다. –

+0

@Mittenchops : 마지막 편집에서 소개 한 버그를 수정했습니다. 예, 더 까다로워집니다. :) –