2015-03-02 21 views
6

Używam Pythona do analizowania interfejsu API policyjnej policji w Wielkiej Brytanii. Chcę tylko przeanalizować odpowiedź JSON, którą otrzymuję, aby obliczyć, ile razy wystąpi pewne przestępstwo. To jest przykład odpowiedzi z interfejsu API.Liczba wystąpień elementu w elemencie 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" 
}, 

Za pomocą tego kodu

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 

uzyskać odpowiedź jak ten

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

Jeśli zmieniłem na pętli

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

I wtedy uzyskać odpowiedź jak

0 
0 
0 
0 
1 
1 
0 

Wyszukiwanie forów przez wiele godzin mi nie pomogło! Jakieś pomysły?

Odpowiedz

0

Utwórz słownik i użyj crimeCategories jako klucza. Dla wartości użyj liczby całkowitej. Spróbuj umieścić coś takiego w swojej pętli.

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

Nie przechowujesz swojego hrabia w dowolnym miejscu. Zasadniczo po prostu wołasz o liczbę przedmiotów aktualnie w twojej pętli.

Będziemy chcieli, aby dodać każdą pozycję jako klucz w słowniku, a następnie mieć Wartość różnicy każdym razem trafisz wystąpienie w twojej pętli

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

Można agregacji danych do mapowania category-> json like this:

from collections import defaultdict 

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

A teraz masz słownik z listą przestępstw w każdej kategorii.

Tak, aby uzyskać jak wiele zbrodni określonej kategorii się wszystko czego potrzebujesz to:

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

Jest to bardzo kłopotliwe w użyciu player zamiast crime, ale cokolwiek widać pasują :)

7

You można użyć dict collections.Counter z wniosków, który staje kilka zwięzłych linii kodu:

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) 

wyjściowa:

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

Jeśli wolisz o normalnej dict po prostu zadzwonić dict na 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} 

Następnie wystarczy dostęp przez klucz c['drugs'] etc ..

Albo iteracyjne nad elementów, aby drukować z przestępczością i liczyć w formacie chcesz:

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

wyjściowa:

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, dzięki, że wygląda lepiej;) –

+0

Osobiście uważam, byłoby jeszcze lepiej, używając 'print (dict (c))'. – martineau

+0

@martineau, dodano dane wyjściowe pprint poniżej –

Powiązane problemy