辞書d1
とリストがありl1
ます。
辞書キーは文字列であり、値は自分で定義したオブジェクトです。役立つ場合は、オブジェクトをより詳細に説明できますが、現時点では、オブジェクトにはリスト属性names
があり、の要素の一部はにname
表示される場合と表示されない場合がありますl1
。
私がやりたかったのは、辞書の要素を破棄することでした。この要素のオブジェクトd1
のname
属性には、に表示される要素が含まれていませんl1
。
簡単な例として:
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant',
'zebra', 'lion', 'snake', 'fly']
d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
'2':['apple', 'pear','cat', 'mouse', 'horse'],
'3':['kiwi', 'lime','cat', 'dog', 'mouse'],
'4':['carrot','potato','cat', 'dog', 'horse'],
'5':['chair', 'table', 'knife']}
1
したがって、結果のディクショナリはほぼ同じになりますが、各リストの要素は、果物と野菜を除くからのキーと値のペア4
になり、家具の値が表示されないため、5番目のキーと値のパーは含まれません。l1
。
これを行うために、私は次のようなネストされたリスト/辞書の理解を使用しました:
d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'5': [],
'4': ['cat', 'dog', 'horse']}
d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'4': ['cat', 'dog', 'horse'],}
これは機能しているように見えますが、7000以上の大きな辞書の場合、処理には約20秒かかります。それ自体は恐ろしいことではありませんが、10,000回繰り返されるループ内でこれを行う必要があるため、現在は実行できません。これをすばやく行う方法について何か提案はありますか?