簡體   English   中英

有沒有更有效的方法來獲得結果(O(n + m)而不是O(n * m))?

[英]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.

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