方法一:
def traverse_take_field(data, fields, values=[], currentKey=None):
"""遍历嵌套字典列表,取出某些字段的值
:param data: 嵌套字典列表
:param fields: 列表,某些字段
:param values: 返回的值
:param currentKey: 当前的键值
:return: 列表
"""
if isinstance(data, list):
for i in data:
traverse_take_field(i, fields, values, currentKey)
elif isinstance(data, dict):
for key, value in data.items():
traverse_take_field(value, fields, values, key)
else:
if currentKey in fields:
values.append(data)
return values
data= [{'species': [{'name': 'PM<sub>2.5</sub>',
'values': [
{'t': {'d': '2022-03-02T00:00:00.000Z', 't': 1, 'dh': 0}, 'v': 90},
{'t': {'d': '2022-04-02T00:00:00.000Z', 't': 32, 'dh': 24}, 'v': 121}
],
'pol': 'pm25'
},
{'name': 'PM<sub>10</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 39},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 48}], 'pol': 'pm10'},
{'name': 'O<sub>3</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 35},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 20}], 'pol': 'o3'},
{'name': 'NO<sub>2</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 9},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 5}], 'pol': 'no2'},
{'name': 'SO<sub>2</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 3},
{'t': {'d': '2022-03-31T00:00:00.000Z', 't': 30, 'dh': 24}, 'v': 3}], 'pol': 'so2'},
{'name': 'CO', 'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 6},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 6}],
'pol': 'co'}],
'dailyhours': 24,
'source': {'sources': [{'name': 'Citizen Weather Observer Program (CWOP/APRS)',
'url': 'http://wxqa.com/', 'pols': ['weather'], 'logo': ''}],
'city': {'name': 'CN:mep/怒江州/泸水一中', 'idx': 7559}, 'timezone': '8.00'}}]
fields = ["d", "v"]
a = traverse_take_field(data, fields)
print(a)
方法二:
data= {'species': [{'name': 'PM<sub>2.5</sub>',
'values': [
{'t': {'d': '2022-03-02T00:00:00.000Z', 't': 1, 'dh': 0}, 'v': 90},
{'t': {'d': '2022-04-02T00:00:00.000Z', 't': 32, 'dh': 24}, 'v': 121}
],
'pol': 'pm25'
},
{'name': 'PM<sub>10</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 39},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 48}], 'pol': 'pm10'},
{'name': 'O<sub>3</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 35},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 20}], 'pol': 'o3'},
{'name': 'NO<sub>2</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 9},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 5}], 'pol': 'no2'},
{'name': 'SO<sub>2</sub>',
'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 3},
{'t': {'d': '2022-03-31T00:00:00.000Z', 't': 30, 'dh': 24}, 'v': 3}], 'pol': 'so2'},
{'name': 'CO', 'values': [{'t': {'d': '2022-03-01T00:00:00.000Z', 't': 0, 'dh': 0}, 'v': 6},
{'t': {'d': '2022-04-01T00:00:00.000Z', 't': 31, 'dh': 24}, 'v': 6}],
'pol': 'co'}],
'dailyhours': 24,
'source': {'sources': [{'name': 'Citizen Weather Observer Program (CWOP/APRS)',
'url': 'http://wxqa.com/', 'pols': ['weather'], 'logo': ''}],
'city': {'name': 'CN:mep/怒江州/泸水一中', 'idx': 7559}, 'timezone': '8.00'}}
pm25 = []
pm10 = []
O3 = []
NO2 = []
SO2 = []
CO = []
for i in data["species"]:
name=i['name']
values=i["values"]
if name =='PM<sub>2.5</sub>':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
pm25.append((d,v))
if name =='PM<sub>10</sub>':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
pm10.append((d,v))
if name =='O<sub>3</sub>':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
O3.append((d,v))
if name =='NO<sub>2</sub>':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
NO2.append((d,v))
if name =='SO<sub>2</sub>':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
SO2.append((d,v))
if name =='CO':
for j in i['values']:
d=j["t"]["d"]
v=j['v']
CO.append((d,v))
print(pm10)