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

pzfprimi  于 2023-11-16  发布在  Python
关注(0)|答案(5)|浏览(140)

我尝试遍历一个JSON对象/列表,以从列表中获取价格。它在第一个“for”循环中工作正常,但对于我的程序,我需要在第一个循环中嵌套另一个“for”循环,有效地继续迭代第一个循环结束的地方。
编辑:我很抱歉,因为我可能不是很清楚为什么我这样构造这段代码。这可能不是最好的解决方案,因为我对python不是很有经验,但我试图根据JSON的历史价格模拟价格数据的循环流。所以当价格等于第一个循环中的某个值时,我试图从上一个循环停止的地方继续数据流(它读取的最后一个价格)在一个嵌套循环中使用不同的if语句,现在第一个问题已经被触发了。我知道这可能是一个非常糟糕的解决这个问题的方法,我很乐意听到关于如何以更简单的方式解决这个问题的建议。

  1. for i in json:
  2. time.sleep(1)
  3. price = i['p']
  4. if price == "0.00000183":
  5. print("foo")
  6. for i in json:
  7. time.sleep(1)
  8. price = float(i['p'])
  9. if price == "0.00000181":
  10. print("sold")
  11. else:
  12. continue
  13. elif price == "0.00000185":
  14. print ("sold")
  15. break
  16. else:
  17. continue

字符串
JSON列表的示例片段:

  1. [
  2. {
  3. "a":4886508,
  4. "p":"0.00000182",
  5. "q":"10971.00000000",
  6. "f":5883037,
  7. "l":5883037,
  8. "T":1566503952430,
  9. "m":1,
  10. "M":1
  11. },
  12. {
  13. "a":4886509,
  14. "p":"0.00000182",
  15. "q":"10971.00000000",
  16. "f":5883038,
  17. "l":5883038,
  18. "T":1566503953551,
  19. "m":1,
  20. "M":1
  21. },
  22. {
  23. "a":4886510,
  24. "p":"0.00000182",
  25. "q":"10971.00000000",
  26. "f":5883039,
  27. "l":5883039,
  28. "T":1566503954431,
  29. "m":1,
  30. "M":1
  31. }
  32. ]

bvjxkvbb

bvjxkvbb1#

在列表中有3个嵌套的dict,并且使用一个值price来存储所有3个;因此,每次迭代都要使用该值。
我建议使用列表解析来获取每个子字典的价格。

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

字符串
这导致:

  1. ['0.00000182', '0.00000182', '0.00000182']


虽然作为一个预先警告,有一个内置的模块称为json,所以如果你想在未来使用它,你将需要使用一个更具描述性的名称;以及您的其他命名约定是非常没有信息摆在首位,考虑更好的约定。
P.S的价格值是字符串,因此它是没有意义的比较,int的

vi4fp9gy

vi4fp9gy2#

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

  1. elementCount = 0
  2. for i in json:
  3. time.sleep(1)
  4. price = i['p']
  5. elementCount = elementCount + 1
  6. if price == "0.00000183":
  7. print("foo")
  8. for i in json[elementCount:]:
  9. time.sleep(1)
  10. price = float(i['p'])
  11. if price == "0.00000181":
  12. print("sold")
  13. else:
  14. continue
  15. elif price == "0.00000185":
  16. print ("sold")
  17. break
  18. else:
  19. continue

字符串
我基本上只是不明白从列表中的某个元素继续迭代的格式,比如[40:]。谢谢你的回答和帮助。

展开查看全部
qco9c6ql

qco9c6ql3#

您的示例代码没有多大意义,因此不清楚您要实现什么。
忽略这一点,如果你使用json.load()来读取你的文件,结果将是一个Python字典列表(相当于JSON object s)。然后你可以直接遍历这个列表-你不需要做任何其他事情来转到下一个字典/对象。
在每个字典/对象中,你可以随机访问它所包含的键/值对。如果你出于某种原因想要覆盖它们,你可以使用obj.keys()obj.values()obj.items(),就像你可以使用任何字典一样。
这里有一个小的例子,我说:

  1. import json
  2. filename = 'list_sample.json'
  3. with open(filename) as json_file:
  4. object_list = json.load(json_file)
  5. for obj in object_list:
  6. if obj['p'] == "0.00000183":
  7. print("foo")
  8. price = float(obj['p'])
  9. print(price)

字符串

展开查看全部
7ajki6be

7ajki6be4#

使用pandas

  1. import pandas as pd

字符串

  • 问题是如何通过json
  • 我认为真实的问题和目标是,我如何从这个对象访问我的数据,并从中收集洞察力。
  • 这就是pandas的强大之处。现在所有的信息都可用并且易于使用。

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

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

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

  1. df = pd.DataFrame(data)

df输出:


的数据

获取p或任何其他信息:

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

展开查看全部
30byixjq

30byixjq5#

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

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

字符串
请注意,只有当内部循环在某个时候被break语句中断时,这才有意义。否则,它将消耗迭代器的所有内容,外部循环将什么都不剩。如果你期望这样,你可能应该跳出外部循环,并在同一级别编写(以前的)内部循环:

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


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

展开查看全部

相关问题