Как получить все итерации в списке без значений, включенных в твит? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть набор твитов с 10 словарями в списке «твиты».Каждый словарь имеет несколько твитов.Первый твит имеет 100, а остальные 9 имеют 15 каждый.Мне нужно расположение каждого твита во всех словарях.Когда я пытаюсь выполнить итерацию значений из списка, он показывает эту ошибку.

if (type(tweets[j]['statuses'][k]['place']['name'])) != None:

TypeError: 'NoneType' object is not subscriptable

Код, который я использовал для итерации:

for j in range (0,10):
    while j == 0:
       for k in range(0,100):
          st1 = tweets[j]['statuses'][k]['place']['name']
          print(st1)

Я пытался использовать «фильтр», чтобы получитьиз «None» значений, даже это не работает.не каждый твит имеет местоположение, помеченное для него.так что у него нет значений.Мне нужно распечатать места помеченных твитов.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Твиттер-API возвращает json, тип dictionary в Python.Когда вы вызываете ключи, используя синтаксис dict[key], это называется subscripting.Теперь вложенные вызовы объекта dict зависят от того, является ли этот объект типом словаря:

dict[a][b] полагается на dict[a], являющийся словарем с ключом b, доступным.Если dict[a] - это другой тип, скажем None или int, это , а не .Это означает, что для этого типа не обязательно есть атрибут get.Простой способ исправить это будет следующим:

check = tweets[j]['statuses'][k]['place']

if isinstance(check, dict):
    # do things

Это гарантирует, что check имеет тип dict и, следовательно, может быть подписан с помощью ключа

EDIT: Примечание.что использование dict[key] синтаксиса не безопасно против KeyErrors.Если вы хотите избежать этого, используйте get:

my_dictionary = {'a': 1, 'b': 2}
my_dictionary['c']     # Raises KeyError: 'c' not in dictionary
my_dictionary.get('c') # returns None, no KeyError

Это принимает форму dict.get(key, <return_value>), где return_value по умолчанию None

Чтобы сделать вашу программу немногоболее читабельным и избежать неизбежного бесконечного цикла, угробить цикл while:

# This will get individual tweets
for tweet in tweets:

    # Returns all statuses or empty list
    statuses = tweet.get('statuses', [])
    for status in statuses:
        if not isinstance(status, dict):
            continue # will jump to next iteration of inner for loop

        # Will be a name or None, if empty dict is returned from place
        name = status.get('place', {}).get('name')
        if name:
            print(name)
0 голосов
/ 12 октября 2018
for element in tweets:
    for s in element.get('statuses'):
       place = s.get('place')
       print(place['name'])

Это исправлено.

0 голосов
/ 12 октября 2018

Вы пытались проверить, доступен ли ключ «место» первым.Из вашего кода я вижу, что вы проверяете ['place'] ['name']

Можете ли вы проверить свою логику с помощью следующей логики фильтра без ['name']:

...
if (isinstance(tweets[j].get('statuses',[])[k].get('place', {}))) == dict:
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...