从 dict 获取具有最新日期时间戳的 id

Get id having the latest datetimestamp from dict

我正在寻找具有最新创建 datetimestamp 值的计算机 VM id,

下面是代码,但它 returns 不正确的值 m3

def get_machine_id_latest_datetimestamp(self):
    thisdict = {
        "machines-xyz-123": {
            "vm": {
                "id": "m1",
                "createTimestamp": "2020-11-27T09:44:02.272908941Z",
                "status": "running"
            }
        },

        "machines-abc-567": {
            "vm": {
                "id": "m2",
                "createTimestamp": "2020-11-27T23:15:22.212021105Z",
                "status": "running"
            }
        },

        "machines-vvy-569": {
            "vm": {
                "id": "m3",
                "createTimestamp": "2020-11-27T22:18:00.572021105Z",
                "status": "running"
            }
        },

        "machines-tgh-m4": {
            "vm": {
                "id": "m4",
                "createTimestamp": "2020-11-27T14:01:22.412621105Z",
                "status": "running"
            }
        }
    }


    machine_id_timestamp_dictionary = {}
    machines_count = len(thisdict)
    machine = list(thisdict.keys())

    for i in range (machines_count):
        machine_id = thisdict[machine[i]]["vm"]["id"]
        vw_creation_timestamp = \
            thisdict[machine[i]]['vm']['createTimestamp']
        machine_id_timestamp_dictionary[machine_id] = vw_creation_timestamp

    latest_created_machine_id = 0
    machine_filtered = set()

    for machine_id in machine_id_timestamp_dictionary:
        if machine_id_timestamp_dictionary[machine_id] > thisdict[machine[i]]['vm']['createTimestamp']:
            latest_created_machine_id = machine_id
            machine_filtered.add(latest_created_machine_id)
    print("Latest Created Machine ID")
    print(latest_created_machine_id)

理想情况下,应返回机器 ID m2,因为它是最新创建的 ID,代码失败的任何指针?

以下。 这个想法是扫描字典值,将每个日期字符串转换为日期时间并找到最大值。

from datetime import datetime

d = {
    "machines-xyz-123": {
        "vm": {
            "id": "m1",
            "createTimestamp": "2020-11-27T09:44:02.272908941Z",
            "status": "running"
        }
    },

    "machines-abc-567": {
        "vm": {
            "id": "m2",
            "createTimestamp": "2020-11-27T23:15:22.212021105Z",
            "status": "running"
        }
    },

    "machines-vvy-569": {
        "vm": {
            "id": "m3",
            "createTimestamp": "2020-11-27T22:18:00.572021105Z",
            "status": "running"
        }
    },

    "machines-tgh-m4": {
        "vm": {
            "id": "m4",
            "createTimestamp": "2020-11-27T14:01:22.412621105Z",
            "status": "running"
        }
    }
}


def _as_dt(x):
    return datetime.strptime(x[:19], '%Y-%m-%dT%H:%M:%S')


values = list(d.values())
latest = values[0]['vm']['id']
latest_date = _as_dt(values[0]['vm']['createTimestamp'])
for i in range(1, len(values)):
    dt = _as_dt(values[i]['vm']['createTimestamp'])
    if dt > latest_date:
        latest_date = dt
        latest = values[i]['vm']['id']
print(f'Latest vm: {latest}')

输出

Latest vm: m2

由于您有 ISO 格式的时间戳,您可以对字符串进行排序(跳过到日期时间的转换效率更高)。设置 reverse=True 并只选择第一个元素:

# assuming 'd' holds your nested dicts:
sortedDicts = sorted(d.values(), key=lambda d: d['vm']['createTimestamp'], reverse=True)

newestVmId = sortedDicts[0]['vm']['id']

print(newestVmId)
# m2