2015-03-02 18 views
6

Tôi đang sử dụng Python để phân tích cú pháp API cảnh sát của Vương quốc Anh. Điều tôi muốn là phân tích phản ứng JSON mà tôi đang nhận được để tính số lần một hành vi phạm tội nào đó xảy ra. Đây là ví dụ về phản hồi từ API.Số lần xuất hiện của mục trong phần tử 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" 
}, 

Sử dụng mã này

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 

tôi nhận được một câu trả lời như thế này

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

Nếu tôi thay đổi của tôi cho vòng lặp để

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

sau đó tôi nhận được một câu trả lời như

0 
0 
0 
0 
1 
1 
0 

Tìm kiếm diễn đàn hàng giờ không giúp ích gì cho tôi! Bất kỳ ý tưởng?

Trả lời

0

Tạo từ điển và sử dụng tội phạmCác danh mục làm khóa. Đối với giá trị, sử dụng một số nguyên. Hãy thử đặt một cái gì đó như thế này trong vòng lặp của bạn.

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

Bạn không lưu trữ số lượng của mình ở bất kỳ đâu. Về cơ bản bạn chỉ cần gọi cho số lượng của mặt hàng hiện tại trong vòng lặp của bạn.

Bạn sẽ muốn thêm từng hạng mục như một chìa khóa trong một cuốn từ điển, và sau đó có tăng giá trị mỗi lần bạn nhấn một lần xuất hiện trong bạn cho vòng lặp

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

Bạn có thể tổng hợp dữ liệu để lập bản đồ của category-> json như thế này:

from collections import defaultdict 

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

Và bây giờ bạn có từ điển với danh sách các tội phạm theo từng danh mục.

Vì vậy, để có được bao nhiêu tội ác của một thể loại nhất định đã xảy ra tất cả các bạn cần là:

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

Nó là vô cùng khó hiểu để sử dụng player thay vì crime, nhưng bất cứ điều gì bạn thấy phù hợp :)

7

Bạn có thể sử dụng một dict.Counter sưu tập với yêu cầu mà trở thành một vài dòng ngắn gọn của mã:

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) 

Đầu ra:

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

Nếu bạn thích có một dict bình thường sau đó chỉ cần gọi dict trên dict Counter:

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} 

Bạn sau đó chỉ cần truy cập bằng phím c['drugs'] vv ..

Hoặc lặp qua các mặt hàng để in tội phạm và đếm ở định dạng mà bạn muốn:

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

Output:

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, cảm ơn, nó trông tốt hơn;) –

+0

Cá nhân, tôi nghĩ rằng nó sẽ trông đẹp hơn bằng cách sử dụng 'print (dict (c))'. – martineau

+0

@martineau, thêm kết quả đầu ra dưới đây –

Các vấn đề liên quan