我是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}]
答案 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}]