我创建了一个字典,用于存储信息,如下所示:
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_v004
和model_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?
解决这个问题的最佳方法是什么?
答案 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
变量(我强烈建议你避免在内置名称之后命名变量)到有序的东西。
一种选择是将数据重构为list
个tuple
个对象。
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