删除列表中的重复词典时如何定义“重复”?

时间:2013-10-24 08:53:38

标签: python list dictionary duplicates

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

详细问题

如何从词典列表中删除重复内容great answer to a stack overflow question

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'的{​​{1}}。因此,修剪下来的列表将是

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

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

1 个答案:

答案 0 :(得分:1)

  1. age排序列表。
  2. 使用name作为关键字从中构建字典。 (键的选择“定义副本”。)如果重复键,则替换先前的值。由于列表已排序,因此最高年龄占优势。
  3. 再次构建一个词典列表。
  4. >>> 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'}]