2015-03-02 119 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循環

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

創建一本詞典並使用crimeCategories作爲鍵。對於該值,使用一個整數。嘗試在你的循環中加入類似的東西。

>>> 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

你可以使用一個collections.Counter字典與請求,成爲幾個簡潔的代碼行:

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}) 

如果你喜歡有一個正常的字典,然後只需調用字典上的計數器字典:

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,謝謝,它看起來更好;) – 2015-03-02 21:51:26

+0

我個人認爲,使用'print(dict(c))'看起來會更好。 – martineau 2015-03-02 21:53:58

+0

@martineau,在下面添加了pprint輸出 – 2015-03-02 21:58:48