摘要:我有一个字典列表,其中一些元素是“重复的”。如何定义“重复”以及如何影响哪个元素保留?
详细问题:
如何从词典列表中删除重复内容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'
上循环并设置一个标志(在上面的案例中的年龄)将最相关的条目复制到一个新列表中 - 但我希望有更多的东西优雅)
答案 0 :(得分:1)
age
排序列表。name
作为关键字从中构建字典。 (键的选择“定义副本”。)如果重复键,则替换先前的值。由于列表已排序,因此最高年龄占优势。
>>> 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'}]