2017-04-20 154 views
0

我在这里有一些代码来比较使用Lambda和过滤器的两个字典。基本上,我为每个EC2实例都有一个必需的标签字典和一个标签字典。Python Lambda比较字典

我需要能够处理两个条件。第一个条件只是检查实例标签中是否存在所有必需的密钥,并且它们不是空白。

requiredTags = {'Name' : ['WebSense','NAT-V2'] } 
instanceTags = i['Instances'][0]['Tags'] 
requiredTagsPresent = filter(lambda x: x['Key'] in requiredTags and 
x['Value'] is not '', instanceTags) 

下一个条件是最常见的 - 检查whethere所有键和它们对应的值是

requiredTagsPresent = filter(lambda x: x['Key'] in requiredTags and x['Value'] in requiredTags, instanceTags) 

到目前为止,我还没有能够在一个单一的完成以上两个脚本。 最后一个条件是我遇到的问题。我想要一个特定的标签值,如果存在的话,我们只检查是否存在相应的密钥,而不管这个值是什么。我不知道该怎么做。

任何提示?

+0

这还不清楚。如果你无法在一个脚本中完成它们,你能用不同的脚本完成每一个脚本吗?你能告诉我们你是怎么做到的吗?什么是'instance_tags'的类型和它看起来是什么样的? –

+0

Instance_Tags是另一个字典。它看起来像这样。 [{'Key':'Name'},{'Value':'j'} - 所以标签是name = j – Josh

回答

1

如果使用内置函数all而不是lambdafilter,这种事情要容易得多。要检查是否在instance_tags存在required_tags所有键和他们不为空,则使用:

all_present = all(k in instance_tags and instance_tags[k] for k in required_tags.keys()) 

要检查instance_tags所有键和值是否在required_tags,使用:

all_present2 = all(k in required_tags and v in required_tags for k, v in instance_tags.items()) 

这假定Python3。

但是我不确定这是你想要的,因为你对第二个测试条件的描述在末尾留下了单词:“检查所有键和它们对应的值是否都是”。是什么?另外,当你在评论中告诉我什么是instance_tags的结构时,你有无与伦比的方括号。你说这是一本字典,但它看起来像一个字典列表,每个字典都包含一个项目。