检查字典键是否为空

hje*_*mig 6 python dictionary

我有以下字典

dict1 ={"city":"","name":"yass","region":"","zipcode":"",
       "phone":"","address":"","tehsil":"", "planet":"mars"}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个将基于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} 
Run Code Online (Sandbox Code Playgroud)

这给了我没有键的字典:“ tehsil”,“ planet”我也尝试了以下方法,但是没有用。

new = {k:dict1[k] for k in dict1 if k not in blacklist and dict1[k] is not None}
Run Code Online (Sandbox Code Playgroud)

结果字典应如下所示:

new = {"name":"yass"}
Run Code Online (Sandbox Code Playgroud)

Hen*_*nyH 5

这是白名单版本:

>>> dict1 ={"city":"","name":"yass","region":"","zipcode":"",
       "phone":"","address":"","tehsil":"", "planet":"mars"}
>>> whitelist = ["city","name","planet"]
>>> dict2 = dict( (k,v) for k, v in dict1.items() if v and k in whitelist )
>>> dict2
{'planet': 'mars', 'name': 'yass'}
Run Code Online (Sandbox Code Playgroud)

黑名单版本:

>>> blacklist = set(("planet","tehsil"))
>>> dict2 = dict( (k,v) for k, v in dict1.items() if v and k not in blacklist )
>>> dict2
{'name': 'yass'}
Run Code Online (Sandbox Code Playgroud)

两者基本上是相同的,期望一个拥有not in另一个in。如果您的python版本支持,则可以执行以下操作:

>>> dict2 = {k: v for k, v in dict1.items() if v and k in whitelist}
Run Code Online (Sandbox Code Playgroud)

>>> dict2 = {k: v for k, v in dict1.items() if v and k not in blacklist}
Run Code Online (Sandbox Code Playgroud)


jam*_*lak 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'}
Run Code Online (Sandbox Code Playgroud)

白名单版本(使用集合交集):

>>> whitelist = {'city', 'name', 'region', 'zipcode', 'phone', 'address'}
>>> {k: dict1[k] for k in dict1.viewkeys() & whitelist if dict1[k]}
{'name': 'yass'}
Run Code Online (Sandbox Code Playgroud)