【问题标题】:Why is my For loop in python printing three times?为什么我在 python 中的 For 循环打印了三遍?
【发布时间】:2021-05-13 10:29:20
【问题描述】:

我正在尝试遍历 JSON 文件以获取特定值,但是,这样做时循环打印了 3 次。我只希望该值打印一次并尝试打破循环,但它仍然没有奏效。

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 文件的 sn-p 是

{
    "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

【问题讨论】:

  • Remove for i in dataz['killRelated']: 并将 print 更改为 print(dataz['killRelated']["SteamID"])。同时删除中断。
  • @user 那行不通。
  • 你认为它应该打印多少次?为什么?用你自己的话来说,你在哪里有for i in dataz:,这样做的目的是什么?您希望外部循环运行多少次?为什么?在您拥有for i in dataz['killRelated']: 的地方,您希望每次外循环迭代 运行多少次?为什么?那么你期望总共有多少输出呢?为什么?
  • 那里有多余的循环。你可能只想要for i in dataz['killRelated']: print(i['SteamID'])
  • “循环遍历整个 JSON 文件”是问题所在。无论“整个 JSON 文件”中存在多少项目,您都在循环通过 killRelated... 没有理由需要多次循环通过 killRelated...

标签: python python-3.x for-loop


【解决方案1】:

json.load 的返回值是一本字典,您只对其中的一个条目感兴趣,该条目由 'killRelated' 键入。现在,针对每个字典条目的 "values" 是列表,所以这就是您需要迭代的内容。而且这样一个列表的每个元素都是一个字典,您可以通过一个键再次访问它。

所以你的代码可能是:

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 只会停止该内部循环,对于您拥有的特定数据而言,无论如何它都是多余的,因为它只会打印一个条目。

【讨论】:

    【解决方案2】:

    您的代码是正确的。您应该检查您的 json 文件,或者您可以共享您的完整 JSON 文本。那将是一个问题。我用你提供的 json sn-p 运行你的代码,它按预期工作。

    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
    

    【讨论】:

    • 我将更新原始问题以放入我的完整 Json 文件。
    • for i in dataz: for i in dataz['killRelated'] 没有任何意义或被认为是“正确的”......
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多