gpt4 book ai didi

python - 在不使用嵌套循环的情况下在字典列表中查找相同的键/值对

转载 作者:行者123 更新时间:2023-12-05 06:05:33 25 4
gpt4 key购买 nike

我正在做一个非常简单的计算,我在字典列表中找到相同的键/值对,通过对它们求和来组合它们。假设数据是:

编辑:name 和 id 是任意名称,例如,我有一个非常大的字典,我在其中使用了多个键

输入

{
"name":"first",
"id":"1234",
"quantity":10
},
{
"name":"first",
"id":"1234",
"quantity":30
},
{
"name":"another",
"id":"0000",
"quantity":10
}

输出

{
"name":"first",
"id":"1234",
"quantity":40
},
{
"name":"another",
"id":"0000",
"quantity":10
}

我很想了解如何以“pythonic”方式执行此操作,尽可能避免嵌套循环。

目前我对它不满意:

for entry in quantities:
for compare in quantities:
if id(entry) != id(compare):
if (entry["name"] == compare["name"]) and (entry["id"] == compare["id"]):
entry["quantity"] = entry["quantity"] + compare["quantity"]
quantities.remove(compare)

感谢任何提示/建议,谢谢!

最佳答案

使用 另一个 字典并在您的键上分组,我的意思是“名称”和“id”(尽管 “id” 还不够吗?如果误导它不会)。

类似于:

grouper = {}
for q in quantities:
key = q['name'], q['id']
if key in grouper:
grouper[key]['quantity'] += q['quantity']
else:
grouper[key] = q.copy()
quantities = list(grouper.values())

在 REPL 中:

In [1]: quantities = [
...: {
...: "name":"first",
...: "id":"1234",
...: "quantity":10
...: },
...: {
...: "name":"first",
...: "id":"1234",
...: "quantity":30
...: },
...: {
...: "name":"another",
...: "id":"0000",
...: "quantity":10
...: }
...: ]

In [2]: grouper = {}

In [3]: for q in quantities:
...: key = q['name'], q['id']
...: if key in grouper:
...: grouper[key]['quantity'] += q['quantity']
...: else:
...: grouper[key] = q.copy()
...:

In [4]: grouper
Out[4]:
{('first', '1234'): {'name': 'first', 'id': '1234', 'quantity': 40},
('another', '0000'): {'name': 'another', 'id': '0000', 'quantity': 10}}

然后您可以直接从值中获取新列表:

In [5]: list(grouper.values())
Out[5]:
[{'name': 'first', 'id': '1234', 'quantity': 40},
{'name': 'another', 'id': '0000', 'quantity': 10}]

这种方法将采用线性时间和线性空间。

请注意,q.copy() 创建一个 副本,这在这里很好,但如果您的字典中有可变值,则可能不会。

另请注意,您可能只想重新考虑您的数据结构。你真的想要一份 list 吗?如果您有唯一键并希望能够通过该键快速找到对象,您可能需要某种类型的字典。

关于python - 在不使用嵌套循环的情况下在字典列表中查找相同的键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65990188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com