[英]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 中,重要的键是event
和stage
。 我必须重新格式化上述数据,以使属于同一event
和stage
的所有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.