2016-12-22 33 views
0

我從API密鑰獲取json。 這是我的JSON:從詞典列表中獲取前5個值?

{'[{"count":27,"stem":"obama","term":"obama"}, 
    {"count":20,"stem":"boehner","term":"boehner"}, 
    {"count":4,"stem":"tax","term":"tax"}, 
    {"count":3,"stem":"daley","term":"daley"}, 
    {"count":3,"stem":"couldn","term":"couldn"}, 
    {"count":2,"stem":"formul","term":"formulation"} 
    ]' : ' '} 

,我想從這個JSON獲得前5名的值。我把這個列出詞典:

def changetodict(data): 
    json_str = ast.literal_eval(json.dumps(data)) 
    #common = json.loads(json_str) 
    commonDict = dict(itertools.izip_longest(*[iter(json_str)] * 2, 
              fillvalue="")) 
    print commonDict 

這是所有代碼:

import urllib2, mediacloud, json,itertools,ast 
from collections import Counter 

webUrl = urllib2.urlopen("https://api.mediacloud.org/api/v2/wc/list?q=obama+AND+media_id:1&stats=1&&fq=publish_date:%5B2012-04-01T00:00:00.000Z+TO+2012-04-01T00:00:00.000Z%5D&key= ") 

def changetodict(data): 
    json_str = ast.literal_eval(json.dumps(data)) 
    #common = json.loads(json_str) 
    commonDict = dict(itertools.izip_longest(*[iter(json_str)] * 2, fillvalue="")) 
    print commonDict 

most_common_imdb_value = Counter(b['key'] for b in commonDict).most_common(1)[0] 

if(webUrl.getcode()== 200): 
    data = webUrl.readlines() 
    changetodict(data) 
else: 
    print "error" 

什麼我需要改變,使其工作?

+1

可以顯示您所希望輸出的例子嗎? –

+0

{「count」:27,「stem」:「obama」,「term」:「obama」},{「count」:20,「stem」:「boehner」,「term」:「boehner」}, 「count」:4,「stem」:「稅」,「term」:「稅」} @Ni。 – adi

+0

我只看到3件物品,你是說前三名? –

回答

1
>>> items = [{"count":27,"stem":"obama","term":"obama"},{"count":20,"stem":"boehner","term":"boehner"},{"count":4,"stem":"tax","term":"tax"},{"count":3,"stem":"couldn","term":"couldn"},{"count":3,"stem":"daley","term":"daley"}] 
>>> from heapq import nlargest 
>>> nlargest(3, items, key=lambda item: item["count"]) 
[{'count': 27, 'term': 'obama', 'stem': 'obama'}, {'count': 20, 'term': 'boehner', 'stem': 'boehner'}, {'count': 4, 'term': 'tax', 'stem': 'tax'}] 
+0

它給了我一個錯誤:文件「C:\ Python27 \ Scripts \ getdominnat.py」,第12行,在 nlargest(3,commonDict,key = lambda item:item [「count」]) TypeError:string indices必須是整數,而不是str – adi

+0

你是否獨立運行此代碼並得到相同的結果?這似乎是在你的代碼'items'是一個字符串,而不是一個列表 –

+0

當我打印類型(commonDict)它給了我: adi

0

你有你的鑰匙的問題,有,}在你的關鍵的最後,要解決,你可以使用:

import ast 
from heapq import nlargest 

for k in data.keys(): 
    k = k[:-3] + ']' 
    k = ast.literal_eval(k) 
    top_5 = nlargest(5, k, key=lambda i: i["count"]) 
    print(top_5) 

編輯:

隨着data更新內容如下應該足夠了:

for k in data.keys(): 
    k = ast.literal_eval(k) 
    top_5 = nlargest(5, k, key=lambda i: i["count"]) 
    print(top_5) 

輸出:

>>> import ast 
>>> from heapq import nlargest 
>>> 
>>> for k in data.keys(): 
...  k = ast.literal_eval(k) 
...  top_5 = nlargest(5, k, key=lambda i: i["count"]) 
...  print(top_5) 
... 
[{'count': 27, 'term': 'obama', 'stem': 'obama'}, {'count': 20, 'term': 'boehner', 'stem': 'boehner'}, {'count': 4, 'term': 'tax', 'stem': 'tax'}, {'count': 3, 'term': 'couldn', 'stem': 'couldn'}, {'count': 3, 'term': 'daley', 'stem': 'daley'}] 
+0

它給了我一個錯誤AttributeError:'list'對象沒有屬性'keys' – adi

+0

數據,使用:'data = {'[{「count」:27,「stem」:「obama」,「term」:「奧巴馬「},...' – ettanany

+0

我的數據是'列表'之前,我改變它'字典' – adi