gpt4 book ai didi

python - 创建唯一列表 : comparing dict objects

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:58 24 4
gpt4 key购买 nike

我有一个对象列表:带有 ID、日期和对象类型的指示。例如

original_list = [{'id':1,'date':'2016-01-01','type':'A'},
{'id':2,'date':'2016-02-01','type':'B'},
{'id':3,'date':'2016-03-01','type':'A'},
{'id':1,'date':'2016-04-01','type':'C'}]

如上所示,此列表可以包含重复的 ID 和不同的日期、类型。现在我想创建一个唯一 ID 列表,其中只包含最后一个条目(基于日期)。现在我有一个程序如下:

# Create list of unique id's
unique_ids = list(set([foo.get('id') for foo in original_list]))

# find last contact
for unique_id in unique_ids:
foo_same_id = [foo for foo in original_list if foo.get('id') == unique_id]
if len(foo_same_id) == 1:
# use this one
else:
latest_date = [foo.get('date') for foo in foo_same_id]
latest_date = max(latest_date)
latest_object = [foo for foo in foo_same_id if foo.get('date') == latest_date]

在此之后,具有相同 id 的列表按日期排序,并且是用于填充对象类型的类型的最后一个值。那时我不再需要这些对象并复制了两个列表(original_list 和 unique_ids),但没有处理过的对象/id。

这似乎可行,但当应用到 200.000 + 时,它会花费很多时间(+ 4 小时)。有什么办法可以加快速度吗?不同的实现?目前我正在从数据库中读取数据并立即开始处理。

最佳答案

不是使用 set 和其他额外操作创建所有唯一 ID,然后遍历列表并使用所有这些额外操作操作,您可以简单地使用自定义词典,以便根据其 ID 保存您的词典。而且由于字典只保留独特的项目,如果你重写 __setitem__ 方法,它只根据日期替换值(如果它大于当前日期)您只需创建您的愿望 list 。

from datetime import datetime


class UniqueDict(dict):
def __init__(self, *args, **kwds):
super(UniqueDict, self).__init__(*args, **kwds)

def __setitem__(self, _id, value):
current = self.get(_id)
if current:
date_obj = datetime.strptime(value['date'], '%Y-%m-%d')
current_date_obj = datetime.strptime(self[_id]['date'], '%Y-%m-%d')
if date_obj > current_date_obj:
dict.__setitem__(self, _id, value)
else:
dict.__setitem__(self, _id, value)

演示:

original_list = [{'id':1,'date':'2016-01-01','type':'A'},
{'id':2,'date':'2016-02-01','type':'B'},
{'id':3,'date':'2016-03-01','type':'A'},
{'id':1,'date':'2016-04-01','type':'C'}]


udict = UniqueDict()

for d in original_list:
udict[d['id']] = d

print(udict)

输出:

{1: {'id': 1, 'date': '2016-04-01', 'type': 'C'},
2: {'id': 2, 'date': '2016-02-01', 'type': 'B'},
3: {'id': 3, 'date': '2016-03-01', 'type': 'A'}}

注意,如评论中所述,在这种情况下,您也可以放弃使用 datetime 将日期字符串转换为日期对象以进行比较,因为 ISO 格式的日期可以是按词典顺序比较。

关于python - 创建唯一列表 : comparing dict objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42745837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com