您可以对列表a 进行排序,这样类似的键就是组,最大值排在最后。然后添加值,使最后一个值是字典中留下的值:
>>> a = [{u'a': 1}, {u'a': 2}, {u'a': 1}, {u'b': 2}, {u'b': 1}, {u'c': 1}, {u'c': 1}]
>>> {k:v for k,v in (x.items()[0] for x in sorted(a))}
{u'a': 2, u'c': 1, u'b': 2}
或者,替代语法:
>>> dict(x.items()[0] for x in sorted(a))
对于 Python 2 和 3 语法:
>>> {k:v for k,v in (sorted(list(x.items())[0] for x in a))}
{'a': 2, 'b': 2, 'c': 1}
>>> dict(sorted(list(x.items())[0] for x in a))
{'a': 2, 'b': 2, 'c': 1}
来自 cmets:这里发生了什么?
首先,让我们举一个更有启发性的例子:
>>> a = [{u'a': -1}, {u'a': -11}, {u'a': -3}, {u'b': 0}, {u'b': 100}, {u'c': 3}, {u'c': 1}]
因此,此处所需的结果是键(对于在 dict 或使用 OrderedDict 中保持顺序的 Python 3)将是 i) 排序值组中的键,然后 ii) 值被解释为递增值中的数字。
所以先试试这个:
>>> sorted(list(x.items())[0] for x in a)
[('a', -11), ('a', -3), ('a', -1), ('b', 0), ('b', 100), ('c', 1), ('c', 3)]
分开:
sorted(list(x.items())[0] for x in a)
^ ^ comprehension of
^ a list of one element dicts
^ ^ ^ convert to a two element tuple
^ sort the tuple first by key, then by value
因此,首先按键对元组进行排序,然后按值对元组进行排序。
这导致使用groupby 的替代解决方案:
>>> from itertools import groupby
>>> for k,v in groupby(sorted(list(x.items())[0] for x in a), key=lambda t: t[0]):
... print(k, max(v))
...
a ('a', -1)
b ('b', 100)
c ('c', 3)
groupby 解决方案对内存更友好,因为它不会创建额外的列表。第一个解决方案可能会使用较小的 dicts 列表更快,因为排序更容易(但您需要对其进行测试。)
在我给出的解决方案中需要将密钥分组(groupby 需要它才能工作)。这也有效:
>>> sorted((list(x.items())[0] for x in a), key=lambda t: t[1])
[('a', -11), ('a', -3), ('a', -1), ('b', 0), ('c', 1), ('c', 3), ('b', 100)]
然后用dict构造函数把它变成dict。回忆一下采用(key, value) 的元组列表:
>>> dict(sorted((list(x.items())[0] for x in a), key=lambda t: t[1]))
{'a': -1, 'b': 100, 'c': 3}