2013-07-24 31 views
0

我有一個JSON對象,我試圖重新分析不同的,我正在尋找一個函數轉換來聚合一個字段的基礎上的兩個獨特鍵控字段。Python函數轉換的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" 
} 
] 

我想使用的名稱和類作爲唯一鍵用於聚集的主題領域---這裏的「額外」字段的內容不同,我'他們都喜歡保存與第一個條目相關的數據 - 也就是說,他們不需要合併,但應該只從一個記錄中獲取值。

所以,我想轉以上爲:

[ 
{ 
"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] 

但是在我的實際數據集,「名」單是不夠的消除歧義 - 我需要按「名稱」和「班級」進行分組。

這不起作用:

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這表明2組密鑰是不平凡的---這真的是必要的,或者是有其他人的方式更熟悉itertools的細節可以指出更好地使用groupby?

+0

爲什麼在結果的第一個字典中「'extra」:「True」? –

+0

這只是爲了說明數據集中有一些字段既不是關鍵字,也不是我想特別彙總的項目,但仍然需要結束。 – Mittenchops

+0

但它不是「結轉」。在「Fred」,「Algebra」的源記錄中,有時是「真」,有時是「假」。那麼我怎麼知道選擇什麼樣的價值呢? –

回答

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'組中每個'name'的第一個匹配值的值更爲棘手? – Mittenchops

+0

@Mittenchops:我剛剛看到您的評論並更新瞭解決方案。 –

+0

@Mittenchops:編輯來糾正我在上次編輯中引入的錯誤。是的,它變得更加棘手。 :) –