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

时间:2017-07-10 19:54:15

标签: 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'}

我试图从字典中的内容中实现以下条件:

  • 抓住最新批准的'版本,如果有任何
  • 抓住最新的'进展中'版本,如果有,如果没有 '已批准'找到版本
  • 抓住最新的'待定'版本,如果有,只有没有
    '已批准'和'进展中'找到版本

使用上面的例子,我应该抓住model_v005,因为它是最新的Approved。 因此,如果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?

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

2 个答案:

答案 0 :(得分:1)

假设最新的'你的意思是最高版本号,你可以做以下事情:

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'

它不是最有效的,但它会创建一个列表,其中包含经过批准的所有模型。状态。如果为空,则会创建一个“正在进行中”的模型列表。状态。如果它是空的,它会创建一个带有'待定'的模型列表。状态。如果为空,则会创建一个仅包含'无'的列表。然后它从最后创建的列表中获取max模型。

答案 1 :(得分:0)

正如我在评论中指出的那样,你需要重构你所谓的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具有每个状态的最新元素(密钥是状态,是model_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