Python-使用for循环通过json对象打印出来

时间:2018-08-26 23:59:32

标签: python json for-loop

因此,我一直在努力制作一种监视器-监视器是什么,只要有新项目,对象,编号是新的,它就会打印出来,然后打印出来基本上没有什么害处。

我正在打印的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']的打印件,那不是问题,它将打印出来。

但是在if item in old_list:的for循环中-问题是除了我添加到列表中的ID号外,它什么都不会打印出来,我想知道如何才能使它打印出来上面给出的json中的名字?

含义:每当我在if item old list等项目['name']之后打印时,都应该给出名称?

2 个答案:

答案 0 :(得分:1)

您的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,如果返回@henry的建议,则将检查整个thread,包括它可能具有的每个属性)

答案 1 :(得分:1)

代码的问题在于,当您创建old_list时,您只会附加每个id的{​​{1}},而不是线程本身。如果您希望能够打印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())