使用Python基于多个键对JSON进行分组
我有这样的数据使用Python基于多个键对JSON进行分组,python,json,Python,Json,我有这样的数据 data = [{'vesselId': '1',"vesselName": "ALPHA 01",'weatherStatus': 'Good','ballastFlag':'B','milesPerMT_min': 'cycling','milesPerMT_max': 3,'milesPerMT_avg':6,"fuelPerMilesPerCargo": nan,'milesPerMT_avg': 3,'speedRange':'10-15'}, {'vessel
data = [{'vesselId': '1',"vesselName": "ALPHA 01",'weatherStatus': 'Good','ballastFlag':'B','milesPerMT_min': 'cycling','milesPerMT_max': 3,'milesPerMT_avg':6,"fuelPerMilesPerCargo": nan,'milesPerMT_avg': 3,'speedRange':'10-15'},
{'vesselId': '1',"vesselName": "ALPHA 01",'weatherStatus': 'Good','ballastFlag':'L','milesPerMT_min': 'cycling','milesPerMT_max': 45,"fuelPerMilesPerCargo": nan,'milesPerMT_avg': 3,'speedRange':'5-10'},
{'vesselId': '1',"vesselName": "ALPHA 01", 'weatherStatus': 'ROUGH','ballastFlag':'L','milesPerMT_min': 'reading', 'milesPerMT_max': 3.0,"fuelPerMilesPerCargo": nan,'milesPerMT_avg': 3,'speedRange':'10-15'},
{'vesselId': '1',"vesselName": "ALPHA 01", 'weatherStatus': 'ROUGH','ballastFlag':'L','milesPerMT_min': 'reading', 'milesPerMT_max': 3.0,"fuelPerMilesPerCargo": nan,'milesPerMT_avg': 3,'speedRange':'15-20'}]
我编写了将数据转换为json格式的代码:
new_data = []
not_found = True
for item in data:
for vesselId in new_data:
not_found = True
if item['vesselId'] == vesselId['vesselId']:
not_found = False
for weatherStatus in vesselId['Fuel_Performance']:
if item['weatherStatus'] == weatherStatus['weatherStatus'] :
weatherStatus['milesPerMT'].append({'milesPerMT_min':item['milesPerMT_min'], 'milesPerMT_max':item['milesPerMT_max'],'milesPerMT_avg':item['milesPerMT_avg']})
else:
vesselId['Fuel_Performance'].append({'weatherStatus':item['weatherStatus'],'ballastFlag':item['ballastFlag'], 'milesPerMT':[{'milesPerMT_min':item['milesPerMT_min'], 'milesPerMT_max':item['milesPerMT_max'],'milesPerMT_avg':item['milesPerMT_avg'],'Speed':item['speedRange']}]})
break
if not_found:
new_data.append({'vesselId':item['vesselId'],'vesselName':item['vesselName'] , 'Fuel_Performance':[{'weatherStatus':item['weatherStatus'], \
'ballastFlag':item['ballastFlag'],'milesPerMT':[{'milesPerMT_min':item['milesPerMT_min'], 'milesPerMT_max':item['milesPerMT_max'],'milesPerMT_avg':item['milesPerMT_avg']}],'fuelPerMilesPerCargo': item['fuelPerMilesPerCargo'],'Speed':item['speedRange']}]})
我得到的输出是这样的
[{'Fuel_Performance': [{'Speed': '10-15',
'ballastFlag': 'B',
'fuelPerMilesPerCargo': nan,
'milesPerMT': [{'milesPerMT_avg': 6,
'milesPerMT_max': 3,
'milesPerMT_min': 8},
{'milesPerMT_avg': 3,
'milesPerMT_max': 45,
'milesPerMT_min': 9}],
'weatherStatus': 'Good'},
{'ballastFlag': 'L',
'milesPerMT': [{'Speed': '10-15',
'milesPerMT_avg': 3,
'milesPerMT_max': 3.0,
'milesPerMT_min': 10},
{'milesPerMT_avg': 3,
'milesPerMT_max': 3.0,
'milesPerMT_min': 10},
{'milesPerMT_avg': 3,
'milesPerMT_max': 3.0,
'milesPerMT_min': 11}],
'weatherStatus': 'ROUGH'},
{'ballastFlag': 'L',
'milesPerMT': [{'Speed': '15-20',
'milesPerMT_avg': 3,
'milesPerMT_max': 3.0,
'milesPerMT_min': 11},
{'milesPerMT_avg': 3,
'milesPerMT_max': 3.0,
'milesPerMT_min': 11}],
'weatherStatus': 'ROUGH'}],
'vesselId': '1',
'vesselName': 'ALPHA 01'}]
我想要的方式如下所示
[
{
"vesselId": 1,
"vesselName": "ALPHA 01",
"fuelPerformance": {
"Good": {
"B": [
{
"speed": "10 - 15",
"milesPerMT": {
"Min": 8,
"Max": 3,
"Avg": 6
},
"fuelPerMilesPerCargo": nan
}
],
"L": [
{
"speed": "5 - 10",
"milesPerMT": {
"Min": 9,
"Max": 45,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
}
]
},
"Rough": {
"L": [
{
"speed": "10 - 15",
"milesPerMT": {
"Min": 10,
"Max": 3,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
},
{
"speed": "15 - 20",
"milesPerMT": {
"Min": 11,
"Max": 3,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
}
]
}
}
}
]
我试图根据下面的逻辑对值进行分组
如果天气状况为“良好”,压载标志可以为“B”或“L”
将B和L的所有键和值分组。同样,当天气状况为“恶劣”时
在我最初的输出中,我无法将三个东西(速度、里程、燃油许可证)放入安定器标志内
在我当前的代码中,我不知道如何根据天气状况和压舱物标志对它们进行分组
import json
adict = {'key2': 'value2', 'key1': 'value1'}
print(json.dumps(adict, indent=4, sort_keys=True))
输出:
{
"key1": "value1",
"key2": "value2"
}
对于通过
新数据循环并检查是否存在某些元素的问题,我采取了维护一个小元目录的方法,该目录保存Vessled、weatherStatus和ballastFlag的信息,如下所示
{'1': {'Good': ['B', 'L'], 'ROUGH': ['L']}}
python脚本:
new_data = []
new_data_meta = {}
def get_vessel(_id):
return list(filter(lambda vessel: vessel["vesselId"] == _id, new_data))[0]
for item in data:
if item["vesselId"] in new_data_meta:
_data = get_vessel(item["vesselId"])
if item["weatherStatus"] in new_data_meta[item["vesselId"]]:
if (
item["ballastFlag"]
in new_data_meta[item["vesselId"]][item["weatherStatus"]]
):
_data["fuelPerformance"][item["weatherStatus"]][
item["ballastFlag"]
].append(
{
"speed": item["speedRange"],
"milesPerMT": {
"Min": item["milesPerMT_min"],
"Max": item["milesPerMT_max"],
"Avg": item["milesPerMT_avg"],
},
"fuelPerMilesPerCargo": item["fuelPerMilesPerCargo"],
}
)
else:
_data["fuelPerformance"][item["weatherStatus"]][item["ballastFlag"]] = [
{
"speed": item["speedRange"],
"milesPerMT": {
"Min": item["milesPerMT_min"],
"Max": item["milesPerMT_max"],
"Avg": item["milesPerMT_avg"],
},
"fuelPerMilesPerCargo": item["fuelPerMilesPerCargo"],
}
]
new_data_meta[item["vesselId"]][item["weatherStatus"]].append(
item["ballastFlag"]
)
else:
_data["fuelPerformance"][item["weatherStatus"]] = {
item["ballastFlag"]: [
{
"speed": item["speedRange"],
"milesPerMT": {
"Min": item["milesPerMT_min"],
"Max": item["milesPerMT_max"],
"Avg": item["milesPerMT_avg"],
},
"fuelPerMilesPerCargo": item["fuelPerMilesPerCargo"],
}
]
}
new_data_meta[item["vesselId"]][item["weatherStatus"]] = [
item["ballastFlag"]
]
else:
new_data.append(
{
"vesselId": item["vesselId"],
"vesselName": item["vesselName"],
"fuelPerformance": {
item["weatherStatus"]: {
item["ballastFlag"]: [
{
"speed": item["speedRange"],
"milesPerMT": {
"Min": item["milesPerMT_min"],
"Max": item["milesPerMT_max"],
"Avg": item["milesPerMT_avg"],
},
"fuelPerMilesPerCargo": item["fuelPerMilesPerCargo"],
}
]
}
},
}
)
new_data_meta[item["vesselId"]] = {item["weatherStatus"]: [item["ballastFlag"]]}
返回以下输出:
[{
"vesselId": "1",
"vesselName": "ALPHA 01",
"fuelPerformance": {
"Good": {
"B": [{
"speed": "10-15",
"milesPerMT": {
"Min": "cycling",
"Max": 3,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
}],
"L": [{
"speed": "5-10",
"milesPerMT": {
"Min": "cycling",
"Max": 45,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
}]
},
"ROUGH": {
"L": [{
"speed": "10-15",
"milesPerMT": {
"Min": "reading",
"Max": 3.0,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
},
{
"speed": "15-20",
"milesPerMT": {
"Min": "reading",
"Max": 3.0,
"Avg": 3
},
"fuelPerMilesPerCargo": nan
}
]
}
}
}]
这回答了你的问题吗?不@MisirJafarov!!!预期的输出不是有效的数据structure@Rakesh,更改了输出的格式!!对不起!如果你想让Python编写不一致的输出,你真的需要自己动手编写Python代码。我不想这么做!!如果这不能给你想要的,你的问题就糟糕了。请阅读。@UlrichEckhardt,改进了这个问题。我糊涂了!!我的错!