【问题标题】:Get only first duplicates in list of dicts with python使用python仅获取dicts列表中的第一个重复项
【发布时间】:2016-05-13 20:22:20
【问题描述】:

我有一个这样的字典列表(虽然最多可以有 12000 个条目):

[
{'date': datetime.datetime(2016, 1, 31, 0, 0), 'title': 'Entry'}, 
{'date': datetime.datetime(2016, 1, 11, 0, 0), 'title': 'Something'},
{'date': datetime.datetime(2016, 1, 01, 0, 0), 'title': 'Entry'}
]

第一个条目是最新的。我想删除具有相同标题的重复项,但保留最旧的。

【问题讨论】:

  • 为什么是字典列表?为什么不用一本以标题为键、日期为值的大字典呢?那么它本质上不能有任何重复。
  • 我之前没用过python,不得不从网站上抓取数据。我只是偶然采取了一种方法来列出听写列表。所以我自己没有具体原因

标签: python list dictionary duplicates


【解决方案1】:

如果您想保留列表的格式,那么您可以保留 setseen 唯一标题,然后通过列表删除条目或添加到 seen

def r_enumerate(iterable):
    #use itertools.izip and xrange if you are using python 2!
    return zip(reversed(range(len(iterable))), 
               reversed(iterable))

seen = set()
for i, subdata in r_enumerate(data):
    if subdata['title'] in seen:
        del data[i]
    else:
        seen.add(subdata['title'])

这不会修改数据的顺序,向后遍历意味着保留较晚(较旧)的条目,并且因为您正在向后遍历它,所以您不必担心删除项目会弄乱其余部分迭代。


另一方面,如果您愿意使用字典来存储所有条目而不是小字典列表,这真的非常简单:

{partdict['title']: partdict['date'] for partdict in LIST_OF_DICTS}

在评估列表中稍后出现的条目时,将覆盖以前的条目,因此这只会保留最旧的条目,更不用说您可以按标题而不是它们在列表中的位置来索引条目。

要返回列表格式(但仅包含每个名称的最旧条目),您可以执行以下操作:

[{'title':title, 'date':date} for title,date in DICT_FORM]

虽然这会打乱顺序并且如果你想首先保持这种格式,需要做更多的工作。

【讨论】:

  • 感谢您的帮助。我已经使用了 jDo 的解决方案,因为它似乎在我的代码中最容易采用。数据的顺序对我来说并不重要。我只是认为如果知道最后一个(或第一个带有反向列表的)标题是要保留的标题会更容易。当我获取数据时,列表已经排序。
  • 如果您使用了 jDo 的答案,为什么不接受它?
【解决方案2】:

我认为这可以满足您的需求,但我也在使用字典而不是列表。它似乎更适合这种类型的数据:

import datetime

dict_list = [
    {'date': datetime.datetime(2016, 1, 31, 0, 0), 'title': 'Entry'},
    {'date': datetime.datetime(2016, 1, 11, 0, 0), 'title': 'Something'},
    {'date': datetime.datetime(2016, 1, 01, 0, 0), 'title': 'Entry'}
]

dict_keys = set(map(lambda x: x["title"], dict_list))

earliest_entries = {k:min(x["date"] for x in dict_list if x["title"] == k) for k in dict_keys}

输出:

>>> earliest_entries
{'Entry': datetime.datetime(2016, 1, 1, 0, 0), 'Something': datetime.datetime(2016, 1, 11, 0, 0)}
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-28
    • 2021-02-04
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多