【问题标题】:Creating a unique list of dictionaries from a list of dictionaries which contains same keys but different values从包含相同键但不同值的字典列表创建唯一的字典列表
【发布时间】:2018-02-03 07:42:31
【问题描述】:

假设我得到了一个这样的字典列表:

[{"id":1, "symbol":'A', "num":4}, {"id":2, "symbol":'A', "num":3}, {"id":1, "symbol":'A', "num":5}, {"id":2, "symbol":'B', "num":1}]

现在,我必须创建一个字典或更改当前字典,以便 (id, symbol) 一起是唯一的,并且 num 值是字典中存在的所有值与 (id,symbol) 的总和,这样新字典或当前字典看起来像这样:

[{"id":1, "symbol":'A', "num":9}, {"id":2, "symbol":'A', "num":3}, {"id":2, "symbol":'B', "num":1}]

【问题讨论】:

  • 请展示你的努力?无论如何,使用别人为你编写的代码不会提高你的编程技能。
  • 真的很抱歉!我今天加入了,不知道你可以问什么类型的问题?我确实尝试过解决它,而不仅仅是立即询问解决方案。我采用的方法是遍历每个字典的列表,当我遇到相同的唯一键值时,我会将该值添加到我的迭代对象中,然后从列表中删除该字典。只是我的代码是超级错误,所以我寻求帮助。如果它违反了本网站的行为准则,我真的很抱歉。

标签: python dictionary


【解决方案1】:

这是一个使用普通 python 的解决方案。

dlst = [{"id":1, "symbol":'A', "num":4}, {"id":2, "symbol":'A', "num":3},
    {"id":1, "symbol":'A', "num":5}, {"id":2, "symbol":'B', "num":1}]


# Create a dict where keys are tuples of (id,symbol), values are num

combined_d = {}

for d in dlst:
    id_sym = (d["id"], d["symbol"])
    if id_sym in combined_d:
        combined_d[id_sym] += d["num"]
    else:
        combined_d[id_sym] = d["num"]

# create a list of dictionaries from the tuple-keyed dict

result = []

for k, v in combined_d.items():
    d = {"id": k[0], "symbol": k[1], "num": v}
    result.append(d)

print(result)

它做你想做的事,但结果列表没有排序,因为它是根据字典构建的。

【讨论】:

  • @Nisrag 很高兴我能提供帮助,我对 python 也很陌生,我可以回答的问题不多,但我发现帮助他人解决他们的问题很棒学习经历:)
【解决方案2】:

我会选择pandas.DataFrame 方式 -

import pandas as pd

a = [{"id":1, "symbol":'A', "num":4}, {"id":2, "symbol":'A', "num":3}, {"id":1, "symbol":'A', "num":5}, {"id":2, "symbol":'B', "num":1}]
b = pd.DataFrame(a)
c = b.groupby(['id', 'symbol'])['num'].sum().reset_index()
print(c)
d = list(c.to_dict(orient='index').values())
print(d)

输出

[{'id': 1, 'symbol': 'A', 'num': 9}, {'id': 2, 'symbol': 'A', 'num': 3}, {'id': 2, 'symbol': 'B', 'num': 1}]

希望有效!

【讨论】:

    【解决方案3】:

    您可以通过以下方式使用groupby

    from itertools import groupby
    from operator import itemgetter
    
    grouper = itemgetter("id", "symbol")
    result = []
    for key, grp in groupby(sorted(input_data, key = grouper), grouper):
        temp_dict = dict(zip(["id", "symbol"], key))
        temp_dict["num"] = sum(item["num"] for item in grp)
        result.append(temp_dict)
    
    from pprint import pprint
    pprint(result)
    

    输出:

    [{'id': 1, 'num': 9, 'symbol': 'A'},
     {'id': 2, 'num': 3, 'symbol': 'A'},
     {'id': 2, 'num': 1, 'symbol': 'B'}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多