2015-03-02 2 views
6

Я использую Python для анализа британского полицейского API. Я хочу проанализировать ответ JSON, который я получаю, чтобы рассчитать, сколько раз происходит определенное нарушение. Это пример ответа API.Подсчет элементов в элементе JSON

{ 
    category: "anti-social-behaviour", 
    location_type: "Force", 
    location: { 
     latitude: "53.349920", 
     street: { 
      id: 583315, 
      name: "On or near Evenwood Close" 
     }, 
     longitude: "-2.657889" 
    }, 
    context: "", 
    outcome_status: null, 
    persistent_id: "", 
    id: 22687179, 
    location_subtype: "", 
    month: "2013-03" 
}, 

Используя этот код

from json import load 
from urllib2 import urlopen 
import json 

url = "http://data.police.uk/api/crimes-street/all-crime?lat=53.396246&lng=-2.646960&date=2013-03" 
json_obj = urlopen(url) 
player_json_list = load(json_obj) 

for player in player_json_list: 
    crimeCategories = json.dumps(player['category'], indent = 2, separators=(',', ': ')) 
    print crimeCategories 

я получаю ответ, как этот

"anti-social-behaviour" 
"anti-social-behaviour" 
"anti-social-behaviour" 
"anti-social-behaviour" 
"drugs" 
"drugs" 
"burglary" 

Если я изменил мой цикл для

for player in player_json_list: 
    crimeCategories = json.dumps(player['category'], indent = 2, separators=(',', ': ')) 
    print crimeCategories.count("drugs") 

я тогда получить ответ как

0 
0 
0 
0 
1 
1 
0 

Поиск по форумам за часами не помог мне! Есть идеи?

ответ

0

Создайте словарь и используйте преступление категорий в качестве ключа. Для значения используйте целое число. Попробуйте положить что-то подобное в свою петлю.

>>> count['testing'] = count.get('testing',0) + 1 
>>> count['testing'] 
1 
0

Вы не храните свой счет нигде. В основном вы просто вызываете счет элемента, находящегося в вашем цикле.

Вы хотите добавить каждый элемент в качестве ключа в словаре, а затем иметь увеличение значения каждый раз, когда вы нажмете вхождение в вашем цикл

adictionary = {"drugs":0} 
for player in player_list: 
    if adictionary.category 
    adictionary.category += 1 
print adictionary.category 
0

Вы могли бы агрегировать данные до отображения категория-> json вот так:

from collections import defaultdict 

players_by_category = defaultdict(list) 
for player in players_json_list: 
    players_by_category[player['category'].append(player) 

И теперь у вас есть словарь со списком преступлений по каждой категории.

Так, чтобы получить сколько преступлений определенной категории произошло все, что вам нужно:

for k, v in players_by_category.iteritems(): 
    print "%s: %s" (k, len(v)) 

Это чрезвычайно запутанным использовать player вместо crime, но все, что вы посчитаете нужным :)

7

You можно использовать collections.Counter Dict с запросами, которая становится несколько лаконичных строк кода:

import requests 
from collections import Counter 

url = "http://data.police.uk/api/crimes-street/all-crime?lat=53.396246&lng=-2.646960&date=2013-03" 
json_obj = requests.get(url).json() 

c = Counter(player['category'] for player in json_obj) 
print(c) 

Выход:

Counter({'anti-social-behaviour': 79, 'criminal-damage-arson': 12, 'other-crime': 11, 'violent-crime': 9, 'vehicle-crime': 7, 'other-theft': 6, 'burglary': 4, 'public-disorder-weapons': 3, 'shoplifting': 2, 'drugs': 2}) 

Если вы предпочитаете иметь нормальную Dict, то просто позвоните Dict на прилавке Dict:

from pprint import pprint as pp 
c = dict(c) 
pp(c) 
{'anti-social-behaviour': 79, 
'burglary': 4, 
'criminal-damage-arson': 12, 
'drugs': 2, 
'other-crime': 11, 
'other-theft': 6, 
'public-disorder-weapons': 3, 
'shoplifting': 2, 
'vehicle-crime': 7, 
'violent-crime': 9} 

Затем вы просто доступ ключ c['drugs'] и т.д ..

Или перебирать пункты для печати преступления и сосчитать в формате, который вы хотите:

for k, v in c.items(): 
    print("{} count: {}".format(k, v) 

Выход:

drugs count: 2 
shoplifting count: 2 
other-theft count: 6 
anti-social-behaviour count: 79 
violent-crime count: 9 
criminal-damage-arson count: 12 
vehicle-crime count: 7 
public-disorder-weapons count: 3 
other-crime count: 11 
burglary count: 4 
+0

@martineau, спасибо, он выглядит лучше;) –

+0

Лично я считаю, он выглядел бы еще лучше, используя 'print (dict (c))'. – martineau

+0

@martineau, добавил вывод pprint ниже –

Смежные вопросы