簡體   English   中英

檢查字典鍵是否為空值

[英]check if dictionary key has empty value

我有以下字典

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"}

這是一個白名單版本:

>>> 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'}

黑名單版本:

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

兩者基本上是相同的,期望一個人not in另一個in 如果你的python版本支持它,你可以這樣做:

>>> dict2 = {k: v for k, v in dict1.items() if v and k in whitelist}

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

這必須是最快的方法(使用設置差異 ):

>>> 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'}

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

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

你走在正確的軌道上。 考慮:

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dict1 ={"city":"","name":"yass","region":"","zipcode":"",
...    "phone":"","address":"","tehsil":"", "planet":"mars"}
>>> 
>>> def isgood(undesired, key, val): return key not in undesired and key and val
... 
>>> dict([x for x in dict1.items() if isgood(["planet", "tehsil"], *x)])
{'name': 'yass'}

只需測試dict1[k]的真值(而不是is None 。)。

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

如果值不是空字符串,則測試是否使用is not None

空字符串的計算結果為False,而任何非空字符串的計算結果為True。 因此,您可以直接測試它,只需從表達式中刪除is not None

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM