Python - распечатка через объекты json с использованием цикла for - PullRequest
0 голосов
/ 27 августа 2018

Итак, я пытался сделать что-то вроде монитора - какой монитор он распечатывает всякий раз, когда новый предмет, объект, номер новый, а затем распечатывает его, практически ничего не причиняя вреда.

json, который я печатаю (я знаю, что сейчас это не правильный формат json, но в настоящий момент он печатает правильные данные)

"threads": {
    "1": {
        "name": "Hello",
        "id": "4174"
    },
    "2": {
        "name": "World",
        "id": "6231"
    },
    "3": {
        "name": "Overflow",
        "id": "7231"
    }
}

В основном я сделалСценарий, который прямо сейчас:

def get_feed():

    url = 'https://www.helloworld.com/loadfilter'
    resp = s.get(url, timeout=6)
    resp.raise_for_status()

    return resp.json()['threads']

old_list = []

for index, thread in get_feed().items():
    old_list.append(thread['id'])

while True:
    try:

        new_list = []
        for index, thread in get_feed().items():
            new_list.append(thread['id'])

        for index, item in enumerate(new_list):
            if item in old_list:
                print(item['name'] # ERROR - string indices must be integers

        else:
            print('Sleeping 2 sec')
            time.sleep(2)


    except Exception as e:
        print(e)


sys.exit()

Так что, в принципе, если я распечатаю внутри for index, thread in get_feed().items(): отпечаток thread['name'], это не будет проблемой, и он будет распечатан.

Однако в цикле for: if item in old_list: - Проблема в том, что он не распечатывает ничего, кроме идентификаторов, которые я добавил в список, и мне интересно, как я могу сделать так, чтобы он печаталвыводить имена через json, который указан выше?

Значение: всякий раз, когда я распечатываю после элемента if item old list и т. д. ['name'], оно должно давать имя?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Проблема с вашим кодом заключается в том, что при создании old_list вы добавляете только id каждого thread, а не сам поток.Если вы хотите иметь возможность печатать name из thread, вам нужно поместить каждый thread объект в old_list.Вы также должны сделать то же самое при создании new_list, чтобы все совпадало.

Вот как вы можете это сделать:

Создание old_list (обратите внимание, что нет необходимости использоватьцикл for для получения значений из словаря):

old_list = list(get_feed().values())

Создание new_list:

new_list = list(get_feed().values())

Проверка / печать:

for thread in new_list:
    if thread in old_list:
        print(thread['name'])
0 голосов
/ 27 августа 2018

Ваш item - это просто thread['id'], и поэтому вы больше не можете получить доступ к name.Вы можете попробовать сохранить весь объект потока в своих списках, а не только id

Например:

for index, thread in get_feed().items():
    new_list.append(thread)

или, как предложено в ответе @ henry, без цикла:

new_list = list(get_feed().values())


И чем вы можете сравнить, если item['id'] находится в old_list и чем print (item['name']) будет работать, потому что у вас будет весь объект thread.

(Изменить: обратите внимание, что здесь мы только проверяем id, если вы вернетесь к предложению @ Генри, вы бы проверили весь thread, включая каждый атрибут, который у него может быть)

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