从字典列表中删除重复的键 Python

13

我正在尝试从以下列表中删除重复项:

distinct_cur = [
    {'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 195, 'st': 0.0, 'htc': 2, '_id': ObjectId('58e86a550a0aeff4e14ca6bb'), 'ftc': 0}, 
    {'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 454, 'st': 0.8, 'htc': 1, '_id': ObjectId('58e8d03958ae6d179c2b4413'), 'ftc': 1},
    {'rtc': 0, 'vf': 2, 'mtc': 1, 'doc': 'test', 'foc': 45, 'st': 0.8, 'htc': 12, '_id': ObjectId('58e8d03958ae6d180c2b4446'), 'ftc': 0}
]

基于以下条件的字典:如果 'doc' 键的值相同,则应删除其中一个字典。我尝试了以下解决方案:

distinct_cur = [dict(y) for y in set(tuple(x.items()) for x in cur)]

但是在最终列表中仍然存在重复项。

如下所示,期望的输出是,对于键“doc”的第1个和第2个distinct_cur文本,它们的值相同(干得好):

[
    {'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 195, 'st': 0.0, 'htc': 2, '_id': ObjectId('58e86a550a0aeff4e14ca6bb'), 'ftc': 0}, 
    {'rtc': 0, 'vf': 2, 'mtc': 1, 'doc': 'test', 'foc': 45, 'st': 0.8, 'htc': 12, '_id': ObjectId('58e8d03958ae6d180c2b4446'), 'ftc': 0}
]

如果您能提供一个样本输出,那将更好。 - JRodDynamite
在字典中,不允许使用重复的键。删除重复键是什么意思?需要删除什么? - Mazdak
1
那么,在找到具有相同“doc”键的字典后,您如何决定应该删除哪一个? - Mazdak
以下是一些类似的问题:https://dev59.com/OW_Xa4cB1Zd3GeqP5-Ct和https://dev59.com/lWox5IYBdhLWcg3wHAsA。 - Mazdak
4个回答

16
你正在创建一个由不同元素组成的set,并期望它将根据只有你知道的标准删除重复项。
你必须遍历列表,并仅在doc具有与先前值不同的值时将其添加到结果列表中: 例如像这样:
done = set()
result = []
for d in distinct_cur:
    if d['doc'] not in done:
        done.add(d['doc'])  # note it down for further iterations
        result.append(d)

通过在辅助集合中注册已知的键,将仅保留具有相同doc键的字典的第一个出现。

另一种可能性是使用以字典的"doc"键作为键的字典,在列表中向后迭代,以便首个项目覆盖列表中的最后一个项目:

result = list({i['doc']:i for i in reversed(distinct_cur)}.values())

1
第二个解决方案中的 result 对象将是 dict_values 类型。您需要使用 list() 函数将其转换为 list 类型。 - Junye Huang
1
你是正确的。正在进行编辑。 - Jean-François Fabre

5

我看到两个类似的解决方案,取决于您的领域问题:您想保留一个键的第一个实例还是最后一个实例?

使用最后一个(以覆盖先前的匹配项)更简单:

d = {r['doc']: r for r in distinct_cur}.values()

3

一行代码用于根据 doc 的主键在字典列表 distinct_cur 中进行去重。

[i for n, i in enumerate(distinct_cur) if i.get('doc') not in [y.get('doc') for y in distinct_cur[n + 1:]]]

1

试试这个:

distinct_cur  =[dict(t) for t in set([tuple(d.items()) for d in distinct_cur])]

对我有用...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接