Я получаю TypeError: объект 'NoneType' не повторяется при попытке отфильтровать список - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь отфильтровать список в Python, удаляя все записи типа None, но когда я пытаюсь это сделать, я получаю ошибку «TypeError:« NoneType »объект не повторяется». Я не вижу, где я иду не так.

Исходная ошибка на самом деле пришла со строкой если у вас "Рестораны" не в бизнесе [у "категорий"]: Там, где я получил ту же ошибку, что и раньше, поэтому я попытался отфильтровать несколько строк назад, чтобы избежать ее, но столкнулся с той же проблемой

Это полный фрагмент кода, хотя сообщение об ошибке появляется в функции фильтра

import json

restaurant_ids = set()

# open the businesses file
with codecs.open(businesses_filepath, encoding='utf_8') as f:

    # iterate through each line (json record) in the file
    for business_json in f:
        # convert the json record to a Python dict
        business = json.loads(business_json)

        business[u"categories"] = filter(lambda a: a is not None, business[u"categories"])
        print business[u"categories"]

#         if this business is not a restaurant, skip to the next one
        if u"Restaurants" not in business[u"categories"]:
            continue

        # add the restaurant business id to our restaurant_ids set
        restaurant_ids.add(business[u'business_id'])

# turn restaurant_ids into a frozenset, as we don't need to change it anymore
restaurant_ids = frozenset(restaurant_ids)

# print the number of unique restaurant ids in the dataset
print '{:,}'.format(len(restaurant_ids)), u'restaurants in the dataset.'

Файл, который я пытаюсь отфильтровать, состоит из JSON с множеством записей, которые выглядят следующим образом. В некоторых категориях просто «Нет», что, похоже, является проблемой.

{"business_id": "1SWheh84yJXfytovILXOAQ", "name": "Arizona Biltmore Golf Club", "address": "2818 E Camino Acequia Drive", "city": "Phoenix", "state": "AZ" "postal_code": "85016", "широта": 33,5221425, "долгота": - +112,0184807, "звезды": 3.0 "REVIEW_COUNT": 5, "is_open": 0, "атрибуты": { "GoodForKids":» False "}," category ":" Golf, Active Life "," hours ": ноль}

Код должен удалить все категории, не относящиеся к "ресторанам", после оператора if, но я не могу даже добраться до этой стадии.

выдает ошибку

TypeError                                 Traceback (most recent call last)
<ipython-input-84-ac1362de4f26> in <module>()
     11         business = json.loads(business_json)
     12 
---> 13         business[u"categories"] = filter(lambda a: a is not None, business[u"categories"])
     14 #         print business[u"categories"]
     15 

TypeError: 'NoneType' object is not iterable

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Это:

filter(lambda a: a is not None, business[u"categories"])

пытается удалить все вхождения None из business["categories"] - что предполагает, что business["categories"] является итеративным. Если это None (только один None, а не список, содержащий None), это действительно вызовет именно эту ошибку:

business = {"categories": None}
filter(lambda a: a is not None, business[u"categories"])

Здесь вы хотите проверить, является ли business[u"categories"] None, а не содержит ли None.

с codecs.open (enterprises_filepath, encoding = 'utf_8') как f:

# iterate through each line (json record) in the file
for business_json in f:
    business = json.loads(business_json)

    categories =   business[u"categories"]
    if categories is None:
        # if it's None it cannot contain "Restaurant" obviously
        continue

    if u"Restaurants" not in categories:
        continue

    # ok it's a restaurant
0 голосов
/ 25 июня 2019

Ошибка нетипа генерируется, когда она получает нулевое (None) значение, поэтому сначала напечатайте (business) и покажите в терминале, что это что-то печатает или нет?далее, переместите другую строку. Я думаю, json.loads (business_json) это ничего не возвращает. Вам следует попробовать json.load (business_json) или business_json.json ()

...