[英]Is there more effective way to get result (O(n+m) rather than O(n*m))?
如下所示的Origin data
,每個項目都有一個類型標記,例如interests, family, behaviors, etc
,我想按此類型字段分組。
return_data = [
{
"id": "112",
"name": "name_112",
"type": "interests",
},
{
"id": "113",
"name": "name_113",
"type": "interests",
},
{
"id": "114",
"name": "name_114",
"type": "interests",
},
{
"id": "115",
"name": "name_115",
"type": "behaviors",
},
{
"id": "116",
"name": "name_116",
"type": "family",
},
{
"id": "117",
"name": "name_117",
"type": "interests",
},
...
]
expected ouput
數據格式如下:
output_data = [
{"interests":[
{
"id": "112",
"name": "name_112"
},
{
"id": "113",
"name": "name_113"
},
...
]
},
{
"behaviors": [
{
"id": "115",
"name": "name_115"
},
...
]
},
{
"family": [
{
"id": "116",
"name": "name_116"
},
...
]
},
...
]
這是我的審判:
type_list = []
for item in return_data:
if item['type'] not in type_list:
type_list.append(item['type'])
interests_list = []
for type in type_list:
temp_list = []
for item in return_data:
if item['type'] == type:
temp_list.append({"id": item['id'], "name": item['name']})
interests_list.append({type: temp_list})
顯然,我的試驗效率很低,因為它是O(n * m),但我找不到解決該問題的更有效方法。
有沒有更有效的方法來獲得結果? 任何評論都非常歡迎,謝謝。
使用defaultdict
存儲每種類型的項目列表:
from collections import defaultdict
# group by type
temp_dict = defaultdict(list)
for item in return_data:
temp_dict[item["type"]].append({"id": item["id"], "name": item["name"]})
# convert back into a list with the desired format
output_data = [{k: v} for k, v in temp_dict.items()]
輸出:
[
{
'behaviors': [
{'name': 'name_115', 'id': '115'}
]
},
{
'family': [
{'name': 'name_116', 'id': '116'}
]
},
{
'interests': [
{'name': 'name_112', 'id': '112'},
{'name': 'name_113', 'id': '113'},
{'name': 'name_114', 'id': '114'},
{'name': 'name_117', 'id': '117'}
]
},
...
]
如果您不想導入defaultdict
,則可以使用帶有setdefault
原始字典:
# temp_dict = {}
temp_dict.setdefault(item["type"], []).append(...)
如果效率略低,則其行為完全相同。
請參閱Python字典中的地圖。
for item in return_data:
typeMap[item['type']] = typeMap[item['type']] + delimiter + item['name']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.