Python 使用字典检查并获取某个条件的最新值

Python 使用字典检查并获取某个条件的最新值,python,dictionary,Python,Dictionary,我创建了一个字典,其中存储的信息如下: dict = {'model_v001': 'In Progress', 'model_v002': 'In Use', 'model_v003': 'In Progress', 'model_v004': 'In Progress', 'model_v005': 'Approved', 'model_v006': 'Pending'} 我试图从字典中的内容中达到以下条件: 获取最新的“批准”版本(如果有) 获取最新的“进行中”版本(如果有)和

我创建了一个字典,其中存储的信息如下:

dict = {'model_v001': 'In Progress',
 'model_v002': 'In Use',
 'model_v003': 'In Progress',
 'model_v004': 'In Progress',
 'model_v005': 'Approved',
 'model_v006': 'Pending'}
我试图从字典中的内容中达到以下条件:

获取最新的“批准”版本(如果有) 获取最新的“进行中”版本(如果有)和(如果没有) 找到“已批准”版本 获取最新的“待定”版本(如果有),只有在没有的情况下 找到“已批准”和“正在进行”版本 使用上面的例子,我应该抓取模型_v005,因为它是最新批准的。 因此,如果模型_v004和模型_v005状态颠倒,则模型_v004将被抓取

keys = dict.keys()
valid_status = ['Element Approved', 'Element in Pipe']
if dict[keys[0]] in valid_status:
    #Use this version
    print 'Using this version'
else:
    #iterate and check the 'previous' version?

解决这个问题的最佳方法是什么?

假设“最新”是指最高版本号,您可以执行以下操作:

original = {
    'model_v001': 'In Progress',
    'model_v002': 'In Use',
    'model_v003': 'In Progress',
    'model_v004': 'In Progress',
    'model_v005': 'Approved',
    'model_v006': 'Pending'}

def best(original):
    return max([key for key, value in original.items() if value == 'Approved']
        or [key for key, value in original.items() if value == 'In Progress']
        or [key for key, value in original.items() if value == 'Pending']
        or [None])

assert best(original) == 'model_v005'

这并不是最有效的,但它创建了一个具有“已批准”状态的所有型号的列表。如果为空,它将创建一个状态为“进行中”的模型列表。如果为空,它将创建一个状态为“挂起”的模型列表。如果该值为空,它将创建一个只有“None”的列表。然后它从最后创建的列表中获取最大模型。

正如我在评论中指出的那样,您需要重构所谓的dict变量。我强烈建议您避免在按顺序命名内置名称后命名变量

一种选择是将数据重构为元组对象列表

为了便于理解,我使用了类型注释,这显然不是必须的

return\u model所做的是创建dict,每个statuskey是status,value是model\u name,然后根据您的规则选择所需的元素。如果不满足任何条件,则返回None

没有类型注释

def return_model(data):
    latest = {}
    for k, v in data:
        latest[v] = k

    for status in ['Approved', 'In Progress', 'Pending']:
        if status in latest:
            return latest['Approved']
    return None

没有最新版本,因为它是无序的dict。字典是无序结构,至少在v3.6之前,如果要保留顺序,请使用collections.OrderedDict。您好,我没有此键入模块。有没有其他方法可以做到这一点?@dispidia只是省略了所有与类型注释相关的内容。这是一个工作代码,只是带有类型注释以使其更清晰。
def return_model(data):
    latest = {}
    for k, v in data:
        latest[v] = k

    for status in ['Approved', 'In Progress', 'Pending']:
        if status in latest:
            return latest['Approved']
    return None