【问题标题】:How to continue iteration of JSON object/list with "for" loop nested in another "for" loop?如何使用嵌套在另一个“for”循环中的“for”循环继续迭代 JSON 对象/列表?
【发布时间】:2019-08-25 01:51:42
【问题描述】:

我正在尝试遍历 JSON 对象/列表以从列表中获取价格。它适用于第一个“for”循环,但对于我的程序,我需要在第一个循环内嵌套另一个“for”循环,以便在第一个循环停止的地方有效地继续迭代。

编辑:我很抱歉,因为我可能不太清楚我为什么要以这种方式构建此代码。这可能不是最好的解决方案,因为我对 python 不是很有经验,但我试图根据这个 JSON 的历史价格来模拟价格数据的循环流。因此,当价格等于第一个循环中的某个值时,我试图在具有不同 if 语句的嵌套循环中从最后一个循环停止的地方(它读取的最后一个价格)继续数据流,现在第一个已被触发。我知道这可能是解决此问题的一种非常糟糕的方法,我很高兴听到有关如何以更简单的方式解决此问题的建议。


for i in json:
    time.sleep(1)
    price = i['p']

    if price == "0.00000183":
        print("foo")

        for i in json:
            time.sleep(1)
            price = float(i['p'])
            if price == "0.00000181":
                print("sold")
            else:
                continue

    elif price == "0.00000185":
        print ("sold")
        break

    else:
        continue

JSON 列表的示例片段:

[
    {
        "a":4886508,
        "p":"0.00000182",
        "q":"10971.00000000",
        "f":5883037,
        "l":5883037,
        "T":1566503952430,
        "m":1,
        "M":1
    },
    {
        "a":4886509,
        "p":"0.00000182",
        "q":"10971.00000000",
        "f":5883038,
        "l":5883038,
        "T":1566503953551,
        "m":1,
        "M":1
    },
    {
        "a":4886510,
        "p":"0.00000182",
        "q":"10971.00000000",
        "f":5883039,
        "l":5883039,
        "T":1566503954431,
        "m":1,
        "M":1
    }
]

【问题讨论】:

  • 你不能只使用 continue 语句而不是另一个 for 循环吗?如果您解释为什么要在列表中重复,我们可能会帮助您避免另一个循环。
  • 你为什么需要做这样的事情?这真的很奇怪,它表明您可能还没有完全理解您要解决的问题,或者您还没有理解语言语法。或者它在上下文中非常有意义,但你没有给我们上下文。请解释此算法的用例。

标签: python json python-3.x list


【解决方案1】:

您在列表中有 3 个嵌套的 dicts,并且您使用一个值 price 来存储所有 3 个;因此覆盖每次迭代的值。

我建议使用简单的列表推导来获取每个子字典的价格。

[i['p'] for i in json]

这会导致:

['0.00000182', '0.00000182', '0.00000182']

虽然有一个名为json 的内置模块作为预警,所以如果您以后想使用它,您需要使用更具描述性的名称;以及您的其他命名约定,首先考虑更好的约定。

P.S 价格值是字符串,因此与 int 比较是没有意义的

【讨论】:

    【解决方案2】:

    您的示例代码没有多大意义,因此不清楚您要完成什么。

    忽略这一点,如果您使用 json.load() 读取文件,结果将是 Python 字典列表(相当于 JSON objects)。之后,您只需遍历此列表即可 - 您无需执行任何其他操作即可转到下一个字典/对象。

    在每个字典/对象中,您可以随机访问它包含的键/值对。如果你出于某种原因想要遍历它们,你可以使用obj.keys()obj.values()obj.items(),就像使用任何字典一样。

    这是我所说的一个小例子:

    import json
    
    filename = 'list_sample.json'
    
    with open(filename) as json_file:
        object_list = json.load(json_file)
    
    for obj in object_list:
        if obj['p'] == "0.00000183":
            print("foo")
            price = float(obj['p'])
            print(price)
    

    【讨论】:

      【解决方案3】:

      使用pandas

      import pandas as pd
      
      • 问题是如何遍历json
        • 我认为真正的问题和目标是,我如何从该对象访问我的数据并从中收集见解。
        • 这就是pandas 的力量。现在所有信息都可用且易于使用。

      如果数据在文件中,如图所示:

      df = pd.read_json('file.json')
      

      如果数据只是一个命名对象(例如data = [{...}, {...}, {...}]

      df = pd.DataFrame(data)
      

      df的输出:

      获取p,或任何其他信息:

      p_list = df.p.tolist()
      print(p_list)
      
      >>> ['0.00000182', '0.00000182', '0.00000182']
      

      【讨论】:

        【解决方案4】:

        您可以使用同一个迭代器对象编写两个循环。您只需要从您的 json 字典列表中创建迭代器:

        iterator = iter(json_data)
        for i in iterator:
            # stuff
        
            for j in iterator: # start looping from where we left off
                ... # more stuff
        

        请注意,这仅在内部循环将在某个时刻被break 语句中断时才有意义。否则它将消耗迭代器的所有内容,并且外部循环将一无所有。如果您期望这样,您可能应该跳出外循环并在同一级别编写(以前的)内循环:

        for i in iterator:
            if something():
                break
        
        for j in iterator: # iterate over the rest of the iterator's values
            ...
        

        请注意,我在示例代码中使用了json_data,而不是您的变量名json。使用json 作为变量名可能不是一个好主意,因为它可能是您用来解析数据的模块的名称。重用名称可能会令人困惑(例如,json = json.load(filename) 只能运行一次)。

        【讨论】:

          【解决方案5】:

          抱歉,伙计们,我应该更清楚地表明,我正在寻找的东西可能比我做出来的东西或我描述它的方式更简单。我基本上只是想从第一个停止的地方继续第二个循环,我现在发现这是一个不错的解决方案。

          elementCount = 0
          for i in json:
              time.sleep(1)
              price = i['p']
              elementCount = elementCount + 1
          
              if price == "0.00000183":
                  print("foo")
          
                  for i in json[elementCount:]:
                      time.sleep(1)
                      price = float(i['p'])
                      if price == "0.00000181":
                          print("sold")
                      else:
                          continue
          
              elif price == "0.00000185":
                  print ("sold")
                  break
          
              else:
                  continue
          

          我基本上只是不明白从列表中的某个元素继续迭代的格式,例如 [40:]。感谢您的所有回答和帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多