0

摘要:我有一个字典列表,其中一些元素被“复制”。如何定义“重复”以及如何影响保留哪个元素?

详细问题

关于如何从字典列表中删除重复项的堆栈溢出问题有一个很好的答案:

l = [
    {'name': 'john', 'age': 20},
    {'name': 'john', 'age': 20},
    {'name': 'mark', 'age': 21},
    {'name': 'john', 'age': 99},
    {'name': 'john'}
]
print [dict(tupleized) for tupleized in set(tuple(item.items()) for item in l)]

但是,我想控制“重复”的定义。例如,假设任何具有相同值的字典'name'对我来说都是“重复的”。预期的输出将只有两个元素(一个为'john',一个为'mark')。

我还想控制保留哪些“重复项”。例如,'age'对于给定的只有最高的那个'name'。因此,修剪后的列表将是

[{'age': 99, 'name': 'john'}, {'age': 21, 'name': 'mark'}]

我怎样才能以一种聪明和 Pythonic 的方式做到这一点?(我目前的想法是在密钥上进行循环'name'并设置一个标志(在上述情况下的年龄)以将最相关的条目复制到一个新列表中——但我希望有更优雅的东西)

4

1 回答 1

1
  1. 按 对列表进行排序age
  2. name使用as 键从它构造一个字典。(键的选择“定义了重复”。)如果键重复,则替换先前的值。因为列表是排序的,所以以最高年龄为准。
  3. 再次构造一个字典列表。

.

>>> uniq = {d['name']: d.get('age') for d in sorted(l, key=lambda d : d.get('age'))}
>>> uniq
{'john': 99, 'mark': 21}
>>> [{'name': k, 'age': v} for k, v in uniq.items()]
[{'age': 99, 'name': 'john'}, {'age': 21, 'name': 'mark'}]
于 2013-10-24T09:18:20.620 回答