我正在尝试遍历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
}
]
答案 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
的输出:p
或其他任何信息:p_list = df.p.tolist()
print(p_list)
>>> ['0.00000182', '0.00000182', '0.00000182']
答案 2 :(得分:0)
您的示例代码没有多大意义,因此不清楚您要完成什么。
忽略这一点,如果您使用来读取文件,则结果将是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:]。感谢您的所有答复和帮助。