2017-04-20 12 views
0

ラムダとフィルタを使用して2つの辞書を比較するためにここにいくつかのコードがあります。基本的には、EC2インスタンスごとに必要なタグ辞書とタグ辞書があります。Python Lambda辞書を比較する

私は2つの条件を処理できる必要があります。最初の条件は、必須タグのすべてのキーがインスタンスタグ内に存在するかどうかをチェックし、空白でないかどうかをチェックするだけです。

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

これは明らかではありません。 1つのスクリプトで両方を達成できない場合は、別々のスクリプトでそれぞれを達成できますか?どうやってそれを見せてくれますか? 'instance_tags'のタイプは何ですか?どのように見えますか? –

+0

Instance_Tagsは別の辞書です。それはこのように見えます。 [{'Key': 'Name'}、{'Value': 'j'} - タグはname = jなので – Josh

答えて

1

lambdafilterではなく、組み込み関数allを使用すると、この種の作業がはるかに簡単です。 required_tags内のすべてのキーがinstance_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を前提としています。

しかし、2番目のテスト条件の説明には、最後に残された言葉があります:「すべてのキーとそれに対応する値を確認してください」という理由で、これがあなたの望むものかどうかはわかりません。何ですか?また、あなたのコメントでinstance_tagsの構造体が何であるか教えてくれたとき、あなたは大カッコが無かった。あなたはそれが辞書だと言ったが、それは辞書のリストのように見え、それぞれは1つの項目を含んでいる。

関連する問題