gpt4 book ai didi

python - 根据另一个键过滤字典列表以删除键中的重复项

转载 作者:太空宇宙 更新时间:2023-11-03 13:28:57 25 4
gpt4 key购买 nike

我有一个 Python 3.5.2 中的字典列表,我正试图对其进行“去重”。所有字典都是唯一的,但我想对一个特定的键进行重复数据删除,使字典中的非空值最多。

例如,我有以下字典列表:

d1 = {"id":"a", "foo":"bar", "baz":"bat"}
d2 = {"id":"b", "foo":"bar", "baz":None}
d3 = {"id":"a", "foo":"bar", "baz":None}
d4 = {"id":"b", "foo":"bar", "baz":"bat"}
l = [d1, d2, d3, d4]

我想将 l 过滤为只有具有唯一 id 键的字典,保留空值最少的字典。在这种情况下,函数应保留 d1d4

我尝试的是为“值计数”创建一个新的键值对,如下所示:

for d in l:
d['val_count'] = len(set([v for v in d.values() if v]))

现在我遇到的问题是如何针对唯一的 id 过滤我的字典列表,其中 val_count 键是更大的值。

我对其他方法持开放态度,但由于资源限制,我无法将 pandas 用于此项目。

预期输出:

l = [{"id":"a", "foo":"bar", "baz":"bat"},
{"id":"b", "foo":"bar", "baz":"bat"}]

最佳答案

我会使用 groupby然后从每组中选出第一个:

1) 首先按键(创建组)和空值的递减计数(您规定的目标)对您的列表进行排序:

>>> l2=sorted(l, key=lambda d: (d['id'], -sum(1 for v in d.values() if v))) 

2) 然后按 id 分组,并在排序列表的 groupby 中取每个迭代器的第一个元素显示为 d:

>>> from itertools import groupby
>>> [next(d) for _,d in groupby(l2, key=lambda _d: _d['id'])]
[{'id': 'a', 'foo': 'bar', 'baz': 'bat'}, {'id': 'b', 'foo': 'bar', 'baz': 'bat'}]

如果您希望“决胜局”选择第一个字典(否则它们具有相同的 null 计数),您可以添加一个枚举装饰器:

>>> l2=sorted(enumerate(l), key=lambda t: (t[1]['id'], t[0], -sum(1 for v in t[1].values() if v)))
>>> [next(d)[1] for _,d in groupby(l2, key=lambda t: t[1]['id'])]

我怀疑额外的步骤实际上是必要的,因为 Python 的排序(和 sorted)是 stable sort并且序列只会根据键和无效计数从列表顺序更改。因此,除非您确定需要使用第二个,否则请使用第一个版本。

关于python - 根据另一个键过滤字典列表以删除键中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50453416/

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