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

2024-05-28 23:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我试着从字典里的内容中达到以下条件:

  • 抓取最新的“批准”版本,如果有的话
  • 抓取最新的'进行中'版本,如果有,如果没有 找到“已批准”版本
  • 获取最新的“挂起”版本(如果有),仅当没有
    找到“已批准”和“正在进行”版本

使用上面的例子,我应该抓取model_v005,因为它是最新批准的。 因此,如果model_v004model_v005状态被反转,那么model_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?

最好的办法是什么


Tags: in版本model字典useversionstatuselement
2条回答

正如我在评论中提到的,您需要将所谓的dict变量(我强烈建议您避免在内置名之后命名变量)重构为有序的

一种方法是将数据重构成listtuple对象

from typing import Optional, List, Tuple

data = [('model_v001', 'In Progress'),
 ('model_v002', 'In Use'),
 ('model_v003', 'In Progress'),
 ('model_v004', 'In Progress'),
 ('model_v005', 'Approved'),
 ('model_v006', 'Pending')]

def return_model(data: List[Tuple[str, str]]) -> Optional[str]:
    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

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

return_model所做的是创建dict,每个状态都有最新的元素(key是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

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

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”的列表。然后从最后创建的列表中获取max模型

相关问题 更多 >

    热门问题