簡體   English   中英

如何在 python 中對帶有條件的 dict 列表進行分組

[英]How to group list of dict with condition in python

我有以下字典列表:

events_list = 

[
{'attribute': '% Organic Matter - soil', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': True, 'ripe_mandated': False}, 
{'attribute': 'Cultivar', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': False, 'ripe_mandated': False}, 
{'attribute': 'Electrical conductivity', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': False, 'ripe_mandated': False}, 
{'attribute': 'Farm Acreage/tomato acreage', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': False, 'ripe_mandated': False}, 
{'attribute': 'Farm GPS coordinates', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': True, 'ripe_mandated': False}, 
{'attribute': 'Soil Amendment 1 date', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': True, 'ripe_mandated': False}, 
{'attribute': 'Air Temperature', 'event': 'Preharvest', 'stage': 'Preharvest', 'founder_mandated': True, 'ripe_mandated': False}, 
{'attribute': 'Activity Number', 'event': 'Shipping', 'stage': 'Transportation', 'founder_mandated': False, 'ripe_mandated': True}, 
{'attribute': 'Batch/Lot or Serial Number', 'event': 'Shipping', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 
{'attribute': 'Data Owner', 'event': 'Shipping', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 
{'attribute': 'Trading Partner', 'event': 'Shipping', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 
{'attribute': 'Product Date', 'event': 'Shipping', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}
{'attribute': 'Data Owner', 'event': 'Receiving', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 
{'attribute': 'Product Date', 'event': 'Receiving', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 
{'attribute': 'Product Identifier(s)', 'event': 'Receiving', 'stage': 'Transportation', 'founder_mandated': False, 'ripe_mandated': True}, 
{'attribute': 'Quantity', 'event': 'Receiving', 'stage': 'Transportation', 'founder_mandated': True, 'ripe_mandated': True}, 

]

在上面的列表中,我們有 16 個字典。 在每個 dict 中,重要的鍵是eventstage 我必須重新格式化上述數據,以使屬於同一eventstage的所有attribute鍵都應在 1 個字典下,它應如下所示:

[
    {
        "event": "Preharvest",
        "stage": "Preharvest",
        "attributes": [
            {
                "attribute_name": "% Organic Matter - soil",
                "founder_mandated": True,
                "ripe_mandated": False
            },
            {
                "attribute_name": "Cultivar",
                "founder_mandated": False,
                "ripe_mandated": False
            },
            # and so on for all attributes...
        ]
    },
    {
        "event": "Shipping",
        "stage": "Transportation",
        "attributes": [
            {
                "attribute_name": "Batch/Lot or Serial Number",
                "founder_mandated": True,
                "ripe_mandated": True
            },
            {
                "attribute_name": "Data Owner",
                "founder_mandated": True,
                "ripe_mandated": True
            },
            # and so on for all attributes...
        ]
    },
    {
        "event": "Receiving",
        "stage": "Transportation",
        "attributes": [
            {
                "attribute_name": "Data Owner",
                "founder_mandated": True,
                "ripe_mandated": True
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": True,
                "ripe_mandated": True
            },
            # and so on for all attributes...
        ]
    }
]

所以為此我寫了下面的代碼:

first_time = True
new_events_list = []
for data in events_list:
    new_event_dict = dict()
    attr_dict = dict()
    attr_list = []
    found = False
    if first_time:
        new_event_dict['stage'] = data['stage']
        new_event_dict['event'] = data['event']
        attr_dict['attribute_name'] = data['attribute']
        attr_dict['founder_mandated'] = data['founder_mandated']
        attr_dict['ripe_mandated'] = data['ripe_mandated']
        attr_list.append(attr_dict)
        new_event_dict['attribute'] = attr_list
        new_events_list.append(new_event_dict)
        first_time = False
    else:
        for data2 in new_events_list:
            if data['stage'] == data2['stage'] and data['event'] == data2['event']:
                found = True
                for data3 in data2['attribute']:
                    if data3['attribute_name'] != data['attribute']:
                        attr_dict['attribute_name'] = data['attribute']
                        attr_dict['founder_mandated'] = data['founder_mandated']
                        attr_dict['ripe_mandated'] = data['ripe_mandated']
                        data2['attribute'].append(attr_dict)
        if not found:
            new_event_dict['stage'] = data['stage']
            new_event_dict['event'] = data['event']
            attr_dict['attribute_name'] = data['attribute']
            attr_dict['founder_mandated'] = data['founder_mandated']
            attr_dict['ripe_mandated'] = data['ripe_mandated']
            attr_list.append(attr_dict)
            new_event_dict['attribute'] = attr_list
            new_events_list.append(new_event_dict)

所以 new_events_list 的new_events_list如下所示:

[
    {
        "event": "Preharvest",
        "stage": "Preharvest",
        "attribute": [
            {
                "attribute_name": "% Organic Matter - soil",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Cultivar",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Electrical conductivity",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Electrical conductivity",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm Acreage/tomato acreage",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm Acreage/tomato acreage",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm Acreage/tomato acreage",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm Acreage/tomato acreage",
                "founder_mandated": false,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Farm GPS coordinates",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Soil Amendment 1 date",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            },
            {
                "attribute_name": "Air Temperature",
                "founder_mandated": true,
                "ripe_mandated": false
            }
        ]
        
    },
    {
        "event": "Shipping",
        "stage": "Transportation",
        "attribute": [
            {
                "attribute_name": "Activity Number",
                "founder_mandated": false,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Batch/Lot or Serial Number",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Data Owner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Data Owner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Trading Partner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Trading Partner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Trading Partner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Trading Partner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            }
        ],
        
    },
    {
        "event": "Receiving",
        "stage": "Transportation",
        "attribute": [
            {
                "attribute_name": "Data Owner",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Date",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Identifier(s)",
                "founder_mandated": false,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Product Identifier(s)",
                "founder_mandated": false,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Quantity",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Quantity",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Quantity",
                "founder_mandated": true,
                "ripe_mandated": true
            },
            {
                "attribute_name": "Quantity",
                "founder_mandated": true,
                "ripe_mandated": true
            }
        ]
        
    }
]

但問題是 output 有很多我們不想要的重復屬性。 我已經嘗試了很多,但無法找到正確格式化上述數據的方法。 任何人都可以請幫忙。 謝謝

我相信你需要。

res = {}
for i in events_list:
    key = f"{i['event']}_{i['stage']}"
    att = {'attribute_name': i.pop('attribute'), 'founder_mandated': i.pop('founder_mandated'), 'ripe_mandated': i.pop('ripe_mandated')}
    if key not in res:
        res[key] = {'attributes': [att], **i}
    else:
        res[key]['attributes'].append(att)
        
print(list(res.values()))

Output:

[{'attributes': [{'attribute_name': '% Organic Matter - soil',
                  'founder_mandated': True,
                  'ripe_mandated': False},
                 {'attribute_name': 'Cultivar',
                  'founder_mandated': False,
                  'ripe_mandated': False},
                 {'attribute_name': 'Electrical conductivity',
                  'founder_mandated': False,
                  'ripe_mandated': False},
                 {'attribute_name': 'Farm Acreage/tomato acreage',
                  'founder_mandated': False,
                  'ripe_mandated': False},
                 {'attribute_name': 'Farm GPS coordinates',
                  'founder_mandated': True,
                  'ripe_mandated': False},
                 {'attribute_name': 'Soil Amendment 1 date',
                  'founder_mandated': True,
                  'ripe_mandated': False},
                 {'attribute_name': 'Air Temperature',
                  'founder_mandated': True,
                  'ripe_mandated': False}],
  'event': 'Preharvest',
  'stage': 'Preharvest'},
 {'attributes': [{'attribute_name': 'Activity Number',
                  'founder_mandated': False,
                  'ripe_mandated': True},
                 {'attribute_name': 'Batch/Lot or Serial Number',
                  'founder_mandated': True,
                  'ripe_mandated': True},
                 {'attribute_name': 'Data Owner',
                  'founder_mandated': True,
                  'ripe_mandated': True},
                 {'attribute_name': 'Trading Partner',
                  'founder_mandated': True,
                  'ripe_mandated': True},
                 {'attribute_name': 'Product Date',
                  'founder_mandated': True,
                  'ripe_mandated': True}],
  'event': 'Shipping',
  'stage': 'Transportation'},
 {'attributes': [{'attribute_name': 'Data Owner',
                  'founder_mandated': True,
                  'ripe_mandated': True},
                 {'attribute_name': 'Product Date',
                  'founder_mandated': True,
                  'ripe_mandated': True},
                 {'attribute_name': 'Product Identifier(s)',
                  'founder_mandated': False,
                  'ripe_mandated': True},
                 {'attribute_name': 'Quantity',
                  'founder_mandated': True,
                  'ripe_mandated': True}],
  'event': 'Receiving',
  'stage': 'Transportation'}]

您還可以為此使用pandas

In [454]: import pandas as pd

In [449]: df = pd.DataFrame(events_list)

In [453]: output = [{"event":x, "stage": y, "attribute":z.to_dict('records')} for (x,y),z in df.set_index(['event', 'stage']).groupby(['event', 'stage'])]

In [454]: output
Out[454]: 
[{'event': 'Preharvest',
  'stage': 'Preharvest',
  'attribute': [{'attribute': '% Organic Matter - soil',
    'founder_mandated': True,
    'ripe_mandated': False},
   {'attribute': 'Cultivar',
    'founder_mandated': False,
    'ripe_mandated': False},
   {'attribute': 'Electrical conductivity',
    'founder_mandated': False,
    'ripe_mandated': False},
   {'attribute': 'Farm Acreage/tomato acreage',
    'founder_mandated': False,
    'ripe_mandated': False},
   {'attribute': 'Farm GPS coordinates',
    'founder_mandated': True,
    'ripe_mandated': False},
   {'attribute': 'Soil Amendment 1 date',
    'founder_mandated': True,
    'ripe_mandated': False},
   {'attribute': 'Air Temperature',
    'founder_mandated': True,
    'ripe_mandated': False}]},
 {'event': 'Receiving',
  'stage': 'Transportation',
  'attribute': [{'attribute': 'Data Owner',
    'founder_mandated': True,
    'ripe_mandated': True},
   {'attribute': 'Product Date',
    'founder_mandated': True,
    'ripe_mandated': True},
   {'attribute': 'Product Identifier(s)',
    'founder_mandated': False,
    'ripe_mandated': True},
   {'attribute': 'Quantity',
    'founder_mandated': True,
    'ripe_mandated': True}]},
 {'event': 'Shipping',
  'stage': 'Transportation',
  'attribute': [{'attribute': 'Activity Number',
    'founder_mandated': False,
    'ripe_mandated': True},
   {'attribute': 'Batch/Lot or Serial Number',
    'founder_mandated': True,
    'ripe_mandated': True},
   {'attribute': 'Data Owner',
    'founder_mandated': True,
    'ripe_mandated': True},
   {'attribute': 'Trading Partner',
    'founder_mandated': True,
    'ripe_mandated': True},
   {'attribute': 'Product Date',
    'founder_mandated': True,
    'ripe_mandated': True}]}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM