对特定对象属性对应的所有值求和的健壮方法?

2024-04-25 01:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数组。你知道吗


items = [
  {
    "title": "title1",
    "category": "category1",
    "value": 200
  },
  {
    "title": "title2",
    "category": "category2",
    "value": 450
  },
  {
    "title": "title3",
    "category": "category1",
    "value": 100
  }
]

这个数组由许多具有categoryvalue属性的字典组成。 使用value求和得到category对象数组的健壮方法是什么:


data= [
  {
    "category": "category1",
    "value": 300
  },
  {
    "category": "category2",
    "value": 450
  }
]

我在寻找最好的算法或方法,既适用于小阵列,也适用于大阵列。如果有一个现有的算法,请指出我的来源。你知道吗

我试过什么??你知道吗


data = []
for each item in items:
    if data has a dictionary with dictionary.category == item.category:
        data's dictionary.value = data's dictionary.value + item.value
    else:
        data.push({"category": item.category, "value":item.value})

注:欢迎使用任何编程语言。请在投票前发表评论。你知道吗


Tags: 方法算法datadictionarytitlevalueitems数组
3条回答

在Python中,Pandas可能是一种更方便、更高效的方法。你知道吗

import pandas as pd
df = pd.DataFrame(items)
sums = df.groupby("category", as_index=False).sum()
data = sums.to_dict("records") 

对于最后一步,将sums保留为数据帧并像这样使用它可能更方便,而不是转换回字典列表。你知道吗

您需要的是一个类似SQLgroup by的操作。通常,那些group by操作是用哈希算法处理的。如果您的所有数据都可以放入内存(从小到大的数据结构),那么您可以非常快速地实现它。你知道吗

如果数据结构庞大,则需要使用中间内存(如硬盘或数据库)。你知道吗

一种简单的python方法是:

data_tmp = {}
for item in items:
    if item['category'] not in data_tmp:
        data_tmp[item['category']] = 0
    data_tmp[item['category']] += item['value']
data = []
for k, v in data_tmp.items():
    data.append({
        'category': k,
        'value': v
    })
# done

如果您想要更多pythonic代码,可以使用defaultdict

from collections import defaultdict
data_tmp = defaultdict(int)
for item in items:
    data_tmp[item['category']] += item['value']
data = []
for k, v in data_tmp.items():
    data.append({
        'category': k,
        'value': v
    })
# done

在javascript中,可以使用reduce将数组分组到对象中。使用类别作为属性。使用Object.values将对象转换为数组。你知道吗

var items = [{ "title": "title1", "category": "category1", "value": 200 }, { "title": "title2", "category": "category2", "value": 450 }, { "title": "title3", "category": "category1", "value": 100 } ]; var data = Object.values(items.reduce((c, v) => { c[v.category] = c[v.category] || {category: v.category,value: 0}; c[v.category].value += v.value; return c; }, {})); console.log(data);

相关问题 更多 >