2016-12-22 4 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" 

내가 그것을 작동 할 수 있도록 변경해야합니까?

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

업데이트

+1

당신이 기대하고있는 출력의 예를 보일 수 있는가? –

+0

{ "개수": 27, "줄기": "오바마", "용어": "오바마"}, { "개수": 20, "줄기": "boehner", "용어": "boehner"}, "count": 4, "stem": "tax", "term": "tax"} @Ni. – adi

+0

3 개 항목 만 보았는데, 상위 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 "")) TypeError : string indices 문자열이 아니어야합니다 – adi

+0

이 코드를 독립적으로 실행하여 동일한 결과를 얻었습니까? 그것은 당신의 코드'items'에있는 문자열처럼 목록이 아닙니다 –

+0

제가 인쇄 할 때 (commonDict) 나에게주는 : adi

0

당신은 당신이 사용할 수있는 해결하기 위해, 키의 말에 ,}이, 당신의 키에 문제가 콘텐츠는 다음과 같이 충분해야합니다.

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" obama "}, ... ' – ettanany

+0

내 데이터가'dict '으로 변경되기 전에 내 데이터가'list '입니다 – adi

관련 문제