如何使用嵌套在另一个“ for”循环中的“ for”循环继续JSON对象/列表的迭代?

时间:2019-08-25 01:51:42

标签: python json python-3.x list

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

edit:我很抱歉,因为我可能不太清楚为什么要用这种方式构造此代码。这可能不是最好的解决方案,因为我对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
    }
]

5 个答案:

答案 0 :(得分:3)

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

我建议使用简单的列表理解来获取每个子指标的价格。

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

结果是:

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

尽管有一个预警,但有一个名为json的内置模块,因此您将来要使用该模块时,您将需要使用更具描述性的名称。以及您的其他命名约定一开始都没有多大用处,因此请考虑使用更好的约定。

P.S价格值是字符串,因此与int的价格相比毫无意义

答案 1 :(得分:0)

使用pandas

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

如果数据位于文件中,则如下所示:

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

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

df = pd.DataFrame(data)

df的输出:

found the following solution

获取p或其他任何信息:

p_list = df.p.tolist()
print(p_list)

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

答案 2 :(得分:0)

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

忽略这一点,如果您使用enter image description here来读取文件,则结果将是Python字典列表(相当于JSON object)。然后,您可以遍历此列表-您无需执行其他任何操作即可转到下一个字典/对象。

在每个字典/对象中,您可以随机访问其包含的键/值对。如果您出于某些原因想要迭代它们,可以像使用任何词典一样使用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 :(得分:0)

您可以使用相同的迭代器对象编写两个循环。您只需要从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)仅可运行一次)。

答案 4 :(得分:0)

抱歉,我应该更清楚地表明,我所寻找的内容可能比我实际确定的内容或描述方式更简单。我基本上只是想从第二个循环从第一个中断的地方继续,现在我发现这是一个不错的解决方案。

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:]。感谢您的所有答复和帮助。