2016-03-10 2 views
0

Я пытаюсь выполнить поиск файла данных, например Yelp.json. В нем работают предприятия в Лос-Анджелесе, Бостон, округ Колумбия.Подсчет элементов в Python из файла JSON

Я написал:

# Python 2 

# read json 
with open('updated_data.json') as facts_data: 
    data = json.load(facts_data) 

# return every unique locality along with how often it occurs 
locality = [] 
unique_locality = [] 
# Load items into lists 
for item in data: 
    locality.append(data["payload"]["locality"]) 
    if data["payload"]["locality"] not in unique_locality: 
     print unique_locality.append(data["payload"]["locality"]) 
# Loops over unique_locality and count from locality 
print "Unique Locality Count:", unique_locality, locality.count(data["payload"]["locality"]) 

Но я получаю ответ «Портсмут 1», что означает, что не обеспечивает все города и не может быть даже при условии, все счетчики. Моя цель в этом разделе - найти этот файл JSON и сказать: «DC: 10 компаний, LA: 20 компаний, Boston: 2 предприятия». Каждая полезная нагрузка представляет собой группировку информации об одном бизнесе, а «местность» - это всего лишь город. Поэтому я хочу, чтобы он нашел, сколько уникальных городов есть, а затем сколько предприятий в каждом городе. Таким образом, одна полезная нагрузка может быть Starbucks в la, другая полезная нагрузка может быть Starbucks в DC, другой может быть Chipotle в la.

Пример JSON файл (JSONlite.com говорит, что его действительный):

"payload": { 
     "existence_full": 1, 
     "geo_virtual": "[\"56.9459720|-2.1971226|20|within_50m|4\"]", 
     "latitude": "56.945972", 
     "locality": "Stonehaven", 
     "_records_touched": "{\"crawl\":8,\"lssi\":0,\"polygon_centroid\":0,\"geocoder\":0,\"user_submission\":0,\"tdc\":0,\"gov\":0}", 
     "address": "The Lodge, Dunottar", 
     "email": "[email protected]", 
     "existence_ml": 0.5694238217658721, 
     "domain_aggregate": "", 
     "name": "Dunnottar Castle", 
     "search_tags": ["Dunnottar Castle Aberdeenshire", "Dunotter Castle"], 
     "admin_region": "Scotland", 
     "existence": 1, 
     "category_labels": [ 
      ["Landmarks", "Buildings and Structures"] 
     ], 
     "post_town": "Stonehaven", 
     "region": "Kincardineshire", 
     "review_count": "719", 
     "geocode_level": "within_50m", 
     "tel": "01569 762173", 
     "placerank": 65, 
     "longitude": "-2.197123", 
     "placerank_ml": 37.27916073464469, 
     "fax": "01330 860325", 
     "category_ids_text_search": "", 
     "website": "http://www.dunnottarcastle.co.uk", 
     "status": "1", 
     "geocode_confidence": "20", 
     "postcode": "AB39 2TL", 
     "category_ids": [108], 
     "country": "gb", 
     "_geocode_quality": "4", 
     "uuid": "3867aaf3-12ab-434f-b12b-5d627b3359c3" 
    }, 
    "payload": { 
     "existence_full": 1, 
     "geo_virtual": "[\"56.237480|-5.073578|20|within_50m|4\"]", 
     "latitude": "56.237480", 
     "locality": "Inveraray", 
     "_records_touched": "{\"crawl\":11,\"lssi\":0,\"polygon_centroid\":0,\"geocoder\":0,\"user_submission\":0,\"tdc\":0,\"gov\":0}", 
     "address": "Cherry Park", 
     "email": "[email protected]", 
     "longitude": "-5.073578", 
     "domain_aggregate": "", 
     "name": "Inveraray Castle", 
     "admin_region": "Scotland", 
     "search_tags": ["Inveraray Castle Tea Room", "Inverary Castle"], 
     "existence": 1, 
     "category_labels": [ 
      ["Social", "Food and Dining", "Restaurants"] 
     ], 
     "region": "Argyll", 
     "review_count": "532", 
     "geocode_level": "within_50m", 
     "tel": "01499 302203", 
     "placerank": 67, 
     "post_town": "Inveraray", 
     "placerank_ml": 41.19978087352266, 
     "fax": "01499 302421", 
     "category_ids_text_search": "", 
     "website": "http://www.inveraray-castle.com", 
     "status": "1", 
     "geocode_confidence": "20", 
     "postcode": "PA32 8XE", 
     "category_ids": [347], 
     "country": "gb", 
     "_geocode_quality": "4", 
     "existence_ml": 0.7914881102847783, 
     "uuid": "8278ab80-2cd1-4dbd-9685-0d0036b681eb" 
    }, 
+1

Можете ли вы поделиться своим обновленным_data.json несколькими записями? – wtpoo

+0

Просто добавлен фрагмент файла JSON – Aaron

+0

Образец json в вашем вопросе не содержит внешних символов '{' и '}'. Если они действительно существуют, тогда, когда вы 'json.load()' it в Python, он станет словарем с только _one_ '" полезной нагрузкой ", потому что словари не могут иметь дубликаты ключей. 'print (data)' и посмотреть, что в нем. – martineau

ответ

0

Если ваша "JSon" семантика нечто вроде

{"payload":{ CONTENT_A }, "payload":{ CONTENT_B }, ..., "payload":{ CONTENT_LAST }} 

это является допустимой JSON строкой, но после того, как вы json.loads строку, он будет оцениваться как

{"payload":{ CONTENT_LAST }} 

И именно поэтому вы в конечном итоге получаете один город и один бизнес.

Вы можете проверить это поведение в этом онлайн-парсере json http://json.parser.online.fr/, проверив поле JS eval.

В этом случае один из способов предварительной обработки вашей строки json состоит в том, чтобы избавиться от ключа «полезной нагрузки» и упаковать словарь контента непосредственно в список. У вас будет строка json в следующем формате.

{[{CONTENT_A}, {CONTENT_B} ..., {CONTENT_LAST} ]} 

Предположим, ваша строка JSON теперь список словаря полезной нагрузки, и у вас есть json.loads (json_str) в данных.

Как вы итерации через полезную нагрузку json, постройте таблицу поиска по пути. Это автоматически обрабатывает дублированный город, так как бизнес в том же городе будет хэширован в тот же список.

city_business_map = {} 
for payload in data: 
    city = payload['locality'] 
    business = payload['name'] 
    if city not in city_business_map: 
     city_business_map[city] = [] 
    city_business_map[city].append(business) 

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

for city, business_list in city_business_map.items(): 
    print city, len(business_list) 

Если вы хотите, чтобы сосчитать уникальный бизнес в каждом городе, инициализировать значение, чтобы установить вместо списка.

Если это перебор, вместо инициализации списка или набора, просто сопоставьте счетчик с каждой клавишей.

+0

@Aaron Ваша строка json не кажется действительной, хотя ... что такое семантика для всей строки json? Являются ли эти полезные данные завернутыми в словарь? – cookieisaac

+0

В конце есть {перед всеми полезными нагрузками и}. – Aaron

+0

@ Аарон, тогда вы должны предварительно обработать эту строку json, как я описал в ответе. – cookieisaac

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