如何通过检查最新的时间戳和值从字典列表中提取

How to extract from the list of dictionary by checking latest timestamp and value

下面有一个字典列表 like

my_dictionary = [
  {
    'name': 'Tester',
    'id': '101',
    'status': 'Failed',
    'lastModifiedDate': '2022-02-14 12:25:32:013302'  },
  {
    'name': 'Developer',
    'id': '102',
    'status': 'Success',
    'lastModifiedDate': '2022-02-14 12:25:32:013302',
  },
  {
    'name': 'Tester',
    'id': '101',
    'status': 'Failed',
    'lastModifiedDate': '2022-02-21 12:25:32:013302'  }
]

下面代码实现的逻辑如下:

response = sorted(my_dictionary, key=lambda x: x['lastModifiedDate'], reverse=True)

response_latest = []
for item in response:
    extracted_response = {}
    for field in item:     
        if item['name'] == 'Tester':
            extracted_response[field] = item[field]
    response_latest.append(extracted_response)
    break
    for field in item:     
        if item['name'] == 'Developer':
            extracted_response[field] = item[field]
    response_latest.append(extracted_response)
    break
response_latest

上面的代码在输入上面的字典列表时的输出是

[{'name': 'Tester',
  'id': '101',
  'status': 'Failed',
  'lastModifiedDate': '2022-02-21 12:25:32:013302'}]

但预期输出是

[{'name': 'Tester',
  'id': '101',
  'status': 'Failed',
  'lastModifiedDate': '2022-02-21 12:25:32:013302'},
 {'name': 'Developer',
  'id': '102',
  'status': 'Success',
  'lastModifiedDate': '2022-02-14 12:25:32:013302'}]

此外,如果缺少 DeveloperTester 字典名称值,代码不应失败。

my_dictionary = [{'name': 'Tester', 'id': '101', 'status': 'Failed', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}, 
{'name': 'Tester', 'id': '101', 'status': 'Failed', 'lastModifiedDate': '2022-02-21 12:25:32:013302'}]

如果pandas在场:

import pandas as pd
df = pd.DataFrame(myd)
maxes = df.groupby('name')['lastModifiedDate'].transform('max')
result = df[df['lastModifiedDate'] == maxes].to_dict(orient='records')

输出:

>>> result
[{'name': 'Developer', 'id': '102', 'status': 'Success', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}, {'name': 'Tester', 'id': '101', 'status': 'Failed', 'lastModifiedDate': '2022-02-21 12:25:32:013302'}]

我尝试过滤 myd 然后找到每一个的最新版本。

tester = list(filter(lambda x: x["name"] == "Tester", myd))
developer = list(filter(lambda x: x["name"] == "Developer", myd))

tester_latest = sorted(tester, key=lambda x: x["lastModifiedDate"], reverse=True)
developer_lastest = sorted(developer, key=lambda x: x["lastModifiedDate"], reverse=True)

response_latest = [
    tester_latest[0] if len(tester_latest) > 0 else None,
    developer_lastest[0] if len(developer_lastest) > 0 else None
]
response_latest = list(filter(None, response_latest)
response_latest

您可以尝试将字典列表转换为 pandas 数据框的方法,并对其执行一些操作。

此示例包括两个 Tester 词典,它们具有相同的 lastModifiedDate 但在 Developer

的情况下具有不同的 lastModifiedDate
my_dictionary_list = [
  {
    'name': 'Tester',
    'id': '101',
    'status': 'Failed',
    'lastModifiedDate': '2022-02-14 12:25:32:013302'},
  {
    'name': 'Developer',
    'id': '102',
    'status': 'Success',
    'lastModifiedDate': '2022-02-14 12:25:32:129405'},
  {
    'name': 'Tester',
    'id': '103',
    'status': 'Failed',
    'lastModifiedDate': '2022-02-14 12:25:32:013302'},
  {
    'name': 'Developer',
    'id': '102',
    'status': 'Success',
    'lastModifiedDate': '2022-02-21 12:25:32:113215'},
  {
    'name': 'Tester',
    'id': '103',
    'status': 'Failed',
    'lastModifiedDate': '2022-02-12 12:25:32:013302'},
]

import pandas as pd
df = pd.DataFrame(my_dictionary_list)
maxes_by_group = df.groupby(['name'])['lastModifiedDate'].transform(max)
print("maxes_by_group output - \n{}".format(maxes_by_group))
result = df[df['lastModifiedDate'] == maxes_by_group].to_dict(orient='records')
print("--------------------")
print("Final result output - \n{}".format(result))

输出-

maxes_by_group output - 
0    2022-02-14 12:25:32:013302
1    2022-02-21 12:25:32:113215
2    2022-02-14 12:25:32:013302
3    2022-02-21 12:25:32:113215
4    2022-02-14 12:25:32:013302
Name: lastModifiedDate, dtype: object
--------------------
Final result output - 
[{'name': 'Tester', 'id': '101', 'status': 'Failed', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}, {'name': 'Tester', 'id': '103', 'status': 'Failed', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}, {'name': 'Developer', 'id': '102', 'status': 'Success', 'lastModifiedDate': '2022-02-21 12:25:32:113215'}]

maxes_by_group 变量输出表示 lastModifiedDate 值的降序排序。

您可以在最终的 result 变量输出中看到三个词典。两个 Tester 名称值具有相同的最大 lastModifiedDate 值,一个 Developer 名称值具有最大 lastModifiedDate 值。