6

私は次の辞書を持っています

dict1 ={"city":"","name":"yass","region":"","zipcode":"",
       "phone":"","address":"","tehsil":"", "planet":"mars"}

私は dict1 に基づく新しい辞書を作成しようとしていますが、

  1. 空の文字列を持つキーは含まれません。
  2. 含めたくないキーは含まれません。

要件 2 を満たすことができましたが、要件 1 で問題が発生しました。私のコードは次のようになります。

dict1 ={"city":"","name":"yass","region":"","zipcode":"",
   "phone":"","address":"","tehsil":"", "planet":"mars"}

blacklist = set(("planet","tehsil"))    
new = {k:dict1[k] for k in dict1 if k not in blacklist} 

これにより、キーのない辞書が得られます: "tehsil", "planet" 次のことも試しましたが、うまくいきませんでした。

new = {k:dict1[k] for k in dict1 if k not in blacklist and dict1[k] is not None}

結果の dict は次のようになります。

new = {"name":"yass"}
4

5 に答える 5

4

これは、それを行うための最速の方法でなければなりません( set differenceを使用):

>>> dict1 = {"city":"","name":"yass","region":"","zipcode":"",
       "phone":"","address":"","tehsil":"", "planet":"mars"}
>>> blacklist = {"planet","tehsil"}
>>> {k: dict1[k] for k in dict1.viewkeys() - blacklist if dict1[k]}
{'name': 'yass'}

ホワイト リスト バージョン ( set Intersectionを使用):

>>> whitelist = {'city', 'name', 'region', 'zipcode', 'phone', 'address'}
>>> {k: dict1[k] for k in dict1.viewkeys() & whitelist if dict1[k]}
{'name': 'yass'}
于 2013-05-22T14:04:59.963 に答える
1

dict1[k](. の代わりに) Truth 値をテストするだけis Noneです。

new = {k:dict1[k] for k in dict1 if k not in blacklist and dict1[k]}
于 2013-05-22T14:07:25.037 に答える
1

値が空の文字列ではないかどうかのテストは、 を使用して行われませんis not None

空の文字列は False として評価され、空でない文字列は True として評価されます。したがって、直接テストしてis not None、式から を削除するだけです。

new = {k:dict1[k] for k in dict1 if k not in blacklist and dict1[k]}
于 2013-05-22T14:30:08.347 に答える