2017-04-20 109 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的結構時,你有無與倫比的方括號。你說這是一本字典,但它看起來像一個字典列表,每個字典都包含一個項目。