Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python基于多个键对JSON进行分组_Python_Json - Fatal编程技术网

使用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,改进了这个问题。我糊涂了!!我的错!