基于密钥的重复值从列表中删除字典

时间:2014-07-30 04:04:37

标签: python dictionary

我是Python新手。假设我有以下词典列表:

mydictList= [{'a':1,'b':2,'c':3},{'a':2,'b':2,'c':4},{'a':2,'b':3,'c':4}]

从上面的列表中,我想删除具有相同键值b的字典。所以结果列表应该是:

mydictList = [{'a':1,'b':2,'c':3},{'a':2,'b':3,'c':4}]

3 个答案:

答案 0 :(得分:3)

您可以根据b的值创建一个新词典,向后迭代mydictList(因为您希望保留b的第一个值),并且只获取值在字典中,像这样

>>> {item['b'] : item for item in reversed(mydictList)}.values()
[{'a': 1, 'c': 3, 'b': 2}, {'a': 2, 'c': 4, 'b': 3}]

如果您使用的是Python 3.x,则可能需要在字典值上使用list函数,例如

>>> list({item['b'] : item for item in reversed(mydictList)}.values())

注意:此解决方案可能无法维护词典的顺序。

答案 1 :(得分:2)

首先,按b值对列表进行排序(Python的排序算法是稳定的,因此具有相同b值的词典将保留其相对顺序。)

from operator import itemgetter
tmp1 = sorted(mydictList, key=itemgetter('b'))

接下来,使用itertools.groupby创建使用相同b值迭代字典的子网站。

import itertools
tmp2 = itertools.groupby(tmp1, key=itemgetter('b))

最后,创建一个仅包含每个子实例的第一个元素的新列表:

# Each x is a tuple (some-b-value, iterator-over-dicts-with-b-equal-some-b-value)
newdictList = [ next(x[1]) for x in tmp2 ]

全部放在一起:

from itertools import groupby
from operator import itemgetter

by_b = itemgetter('b')
newdictList = [ next(x[1]) for x in groupby(sorted(mydictList, key=by_b), key=by_b) ]

答案 2 :(得分:0)

非常直接的方法可以是这样的:

mydictList= [{'a':1,'b':2,'c':3},{'a':2,'b':2,'c':4},{'a':2,'b':3,'c':4}]

b_set = set()
new_list = []

for d in mydictList:
    if d['b'] not in b_set:
        new_list.append(d)
        b_set.add(d['b'])

结果:

>>> new_list
[{'a': 1, 'c': 3, 'b': 2}, {'a': 2, 'c': 4, 'b': 3}]