<p>您可以使用<code>dict</code>来累积项目</p>
<p>字典可以将<code>id</code>存储为键,将列表项存储为值。仅当不存在具有相同键的项时,才在字典中插入项;如果它确实比较了<code>updated_at</code>值,并在需要时更新字典</p>
<pre><code>def generate_new_list(my_list):
counts = {}
for d in my_list:
item_id = d['id']
if item_id in counts:
if d['updated_at'] > counts[item_id]['updated_at']:
counts[item_id] = d
else:
counts[item_id] = d
return list(counts.values())
</code></pre>
<p>还有几点注意:</p>
<ul>
<li>如果要保持原始顺序,请确保使用Python3.7(保证DICT按插入顺序排序)或使用OrderedDict。使用标准dict时,您必须首先弹出条目,因为<em>替换</em>不会更改dict顺序(因此每个项目将按照其id第一次出现的顺序输出),而ordereddict对该用例有特殊支持(移动到末尾)</李>
<li><p>您还可以使用<code>dict.get</code>和“空对象模式”删除特殊情况:</p>
<pre class="lang-py prettyprint-override"><code>MISSING = {'updated_at': '0'} # pseudo-entry smaller than all possible
def generate_new_list(my_list):
counts = {}
for d in my_list:
if d['updated_at'] > counts.get(d['id'], MISSING):
counts[d['id']] = d
return list(counts.values())
</code></pre></li>
<li>一个非dict的替代方法(尽管它在很大程度上不保存顺序)是按(id,updated_by)排序,按id分组,然后只保留最后一个条目。我不认为stdlib提供了开箱即用的最后一个操作(islice不接受负索引),所以您要么手工操作,要么首先将子条目具体化到列表中</李>
</ul>