为什么python中的For循环要打印三次?

2024-10-02 02:31:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图循环通过一个JSON文件来获得特定的值,但是,当这样做时,循环会打印三次。我只想打印一次值,并尝试打破循环,但仍然没有工作

Python代码:

with open(filename) as json_filez:
  dataz = json.load(json_filez)
  for i in dataz:
   for i in dataz['killRelated']:
     print(i["SteamID"])
        break

我的json文件的一个片段是

{
    "killRelated": [
        {
            "SteamID": "76561198283763531",
            "kill": "15,302",
            "shotacc": "16.1%"
        }
    ],
    "metaData": [
        {
            "test": "lol"
        }
    ],
    "miscData": [
        {
            "damageGiven": "2,262,638",
            "gamePlayed": "1,292",
            "moneyEarned": "50,787,000",
            "score": "31,122",
            "timePlayed": "22d 11h 56m"
        }
    ]
}

这是我的输出:

76561198283763531
76561198283763531
76561198283763531 

预期产出:

76561198283763531

Tags: 文件代码injsonforaswithload
2条回答

来自json.load的返回是一个字典,您只对其中的一个条目感兴趣,由'killRelated'键控。现在,针对每个字典条目的“值”是列表,因此这就是您需要迭代的内容。这样一个列表的每个元素都是一个字典,你可以通过一个键再次访问它

因此,您的代码可以是:

with open(filename) as json_filez:
    dataz = json.load(json_filez)
    for kr in dataz['killRelated']: # iterate through the list under the top-level keyword
        print (kr["SteamID"])

现在,在示例数据中,dataz['killRelated']列表中只有一个条目,因此您只能打印该条目。但总的来说,你应该期望有多个条目——并且考虑到没有条目的可能性。您可以通过try/except通过检查密钥存在来处理该问题;这是后者:

with open(filename) as json_filez:
    dataz = json.load(json_filez)
    if 'killRelated' in dataz:          # check for the top keyword 
        for kr in dataz['killRelated']: # iterate through the list under this keyword
            if 'steamID' in kr:         # check for the next level keyword
                print (kr["SteamID"])   # report it

您得到了三行输出,因为您的外循环在dataz中的所有关键字条目上进行了迭代(尽管没有检查它们),然后在其中的每一次也在dataz['killRelated']列表上进行了迭代。添加break只会停止该内部循环,对于您拥有的特定数据,该内部循环是多余的,因为它只会打印一个条目

你的代码是正确的。你应该检查你的json文件,或者你可以分享你的json全文。这将是一个问题。我使用您提供的json代码段运行您的代码,它按预期工作

import json

with open("test.json") as json_filez:
   dataz = json.load(json_filez)
   for i in dataz:
       for i in dataz['killRelated']:
           print(i["SteamID"])

结果如下:

76561198283763531

相关问题 更多 >

    热门问题