Python 有没有一种方法可以根据一个字典中的值小于另一个字典中的相同键来筛选字典列表?

Python 有没有一种方法可以根据一个字典中的值小于另一个字典中的相同键来筛选字典列表?,python,dictionary,filter,list-comprehension,Python,Dictionary,Filter,List Comprehension,我为这个复杂的标题道歉。我需要根据一个相当具体的标准筛选字典列表 通常情况下,我会做一个列表理解,但我对逻辑没有把握 下面是一个示例列表: list_dict = [{'item_id': '000354', 'ts_created': '11/12/2013', 'item_desc': 'a product'}, {'item_id': '000354', 'ts_created': '11/13/2013', 'item_desc': 'a product'},

我为这个复杂的标题道歉。我需要根据一个相当具体的标准筛选字典列表

通常情况下,我会做一个列表理解,但我对逻辑没有把握

下面是一个示例列表:

list_dict = [{'item_id': '000354', 'ts_created': '11/12/2013', 'item_desc': 'a product'},
             {'item_id': '000354', 'ts_created': '11/13/2013', 'item_desc': 'a product'},
             {'item_id': '000355', 'ts_created': '11/12/2013', 'item_desc': 'a different product'}]
您会注意到,除了“ts_created”之外,前两个字典项是相同的

我想创建一个新字典,保留所有具有最早时间戳的项,并丢弃其余项

编辑:从标题中删除“优雅”,因为它似乎冒犯了一些人

编辑2:尝试改进标题

编辑3(聚焦?):我真的不知道如何聚焦这个问题,但我会试试。参考上面的示例代码(实际列表要大得多),列表中有重复的字典。它们之间的唯一区别是“ts_created”值。我只想保留唯一的“item_id”字典,并进一步保留最早的“ts_created”。结果列表如下所示

list_dict = [{'item_id': '000354', 'ts_created': '11/12/2013', 'item_desc': 'a product'},
             {'item_id': '000355', 'ts_created': '11/12/2013', 'item_desc': 'a different product'}]

您可以使用
pandas.DataFrame
,按日期排序,然后删除所有重复项

导入熊猫
df=熊猫。数据帧(列表)
#迄今为止
df['ts_created']=pandas.to_datetime(df['ts_created']))
#按项目id排序,然后按日期排序
df.sort_值(按=['item_id','ts_created'],inplace=True)
#删除重复项,只留下第一个项目\u id
df.drop_duplicates(子集=['item_id'],keep='first',inplace=True)
#将日期转换回原始格式
df['ts_created']=df.ts_created.dt.strftime(“%m/%d/%Y”)
#再次创建列表
df.to_dict(orient='records')

您可以使用项目id上键入的词典词典词典筛选词典。填充索引词典时,只保留时间戳最大的项目。由于时间戳是国际标准中未格式化的字符串,因此需要将其转换为实际日期以进行比较。可以使用第二个字典(也在项目_id上编制索引)来跟踪转换的时间戳

list_dict = [{'item_id': '000354', 'ts_created': '11/12/2013', 'item_desc': 'a product'},
             {'item_id': '000354', 'ts_created': '11/13/2013', 'item_desc': 'a product'},
             {'item_id': '000355', 'ts_created': '11/12/2013', 'item_desc': 'a different product'}]

from datetime import datetime
maxDates = dict()  # association between item and timestamp
result   = dict()  # indexed single instance result (dictionary of dictionaries)
for d in list_dict:
    key       = d['item_id']
    timestamp = datetime.strptime(d['ts_created'], '%m/%d/%Y') # usable timestamp
    if itemId not in result or timestamp>maxDates[key]:        # keep only latest
        result[key]   = d
        maxDates[key] = timestamp
result = list(result.values())    # convert back to a list of dictionaries

print(result)
        
[{'item_id': '000354', 'ts_created': '11/13/2013', 'item_desc': 'a product'},
 {'item_id': '000355', 'ts_created': '11/12/2013', 'item_desc': 'a different product'}]
如果唯一性由多个字段决定(而不仅仅是项id),则需要将所有值合并到一个键中

例如(对于除时间戳以外的所有字段):


请将您的“不够优雅”代码编辑到您的问题中,作为一个整体。我的建议是,如果您对列表理解或生成器表达式没有信心,那么只需将它们作为for循环编写即可-使用for循环意味着您可以调试或添加print语句以查看发生了什么,这在一行程序中都是不可能的。嗨,ZombieDev,欢迎使用堆栈溢出!请帮助我更好地理解这些要求。目标是从创建日期最早的词典列表中返回词典吗?如果有多个词典具有相同的最早创建日期,则返回它们作为词典列表?这是否回答了您的问题?首先使用
ts_创建的
进行排序,然后删除重复项。第一步。第二步。编辑我的问题以提高清晰度@这些链接非常有用!基本上,将它们分解、排序,然后构建一个新的词典列表。谢谢你的帮助,不客气。欢迎来到StackOverflow。一个能得到答案的好问题的一个要求是,把你尝试过的东西的代码贴出来,而不仅仅是“这就是我拥有的,这就是我想要的,为我去做吧”,即使你不是故意的。很高兴这两个链接(步骤)有所帮助。在尝试解决方案时,如果遇到特定问题,请发布另一个问题或编辑此问题。另外,我把它作为一个1/2的重复问题关闭了。
key = tuple(d[k] for k in sorted(d) if k != 'ts_created')