嗨,我是 python 新手,我正在嘗試使用包含空串列或空值的值來過濾這個字典。下面是名為回應的字典:
response = {'name': 'py',
'title': 'Py',
'description': 'Python library and collection of scripts that automate work on MediaWiki sites', 'url': 'https://www.me',
'keywords': [],
'author': [{'name': 'team'}],
'repository': 'https://gecore',
'subtitle': None,
'id': None,
'alternates': [],
'username': None,
'deprecated': False,
'by': None,
'experimental': False,
'for': ['*'],
'icon': 'https://commons.wikimedia.org/wiki/File:Pywikibot_MW_gear_icon.svg',
'license': 'MIT',
'sponsor': [],
'available_languages': [],
'technology_used': ['python'],
'tool_type': 'framework',
'api': None,
'developer_url': [{'d_url': 'https://www.mement', 'language': 'en'}],
'user_url': [{'language': 'en', 'm_url': 'https://www.Spec'}, {'t_url': 'https://doc.media', 'language': 'en'}],
'feedback': [],
'privacy': [],
'translate_url': 'https://translate.bot',
'bugtracker_url': 'https://phabbot/',
'annotations': {
'wid': None,
'depre': False,
'by': None,
'exp': False,
'for': [],
'icon': None,
'available_languages': ['en'],
'ttype': None,
'rey': Null,
'api': None,
'dev_doc': [{'url': 'https://www.medial:t', 'language': 'en'}], 'user_url': [],
'feedback': [],
'privacy': [],
'translat': None,
'bugtracker': None},
'_schema': None,
'_language': 'en',
'origin': 'api',
'created_by': {'id': 10, 'username': 'JJMC89'},
'created_date': '2021-10-12T20:26:29.012245Z',
'modified_by': {
'id': 3,
'username': 'BD'
},
'modified_date': Null}
我的代碼:
print([response if response.values() == [] or Null or None])
在 jupyter notebook 上運行它時出現錯誤。我的代碼正在嘗試使用條件過濾字典(其中字典的值具有空串列或空值) - 創建滿足此條件的字典串列。
uj5u.com熱心網友回復:
空不存在。您可以使用np.nan來自numpy.
response = {'name': 'py',
'title': 'Py',
'description': 'Python library and collection of scripts that automate work on MediaWiki sites', 'url': 'https://www.me',
'keywords': [],
'author': [{'name': 'team'}],
'repository': 'https://gecore',
'subtitle': None,
'id': None,
'alternates': [],
'username': None,
'deprecated': False,
'by': None,
'experimental': False,
'for': ['*'],
'icon': 'https://commons.wikimedia.org/wiki/File:Pywikibot_MW_gear_icon.svg',
'license': 'MIT',
'sponsor': [],
'available_languages': [],
'technology_used': ['python'],
'tool_type': 'framework',
'api': None,
'developer_url': [{'d_url': 'https://www.mement', 'language': 'en'}],
'user_url': [{'language': 'en', 'm_url': 'https://www.Spec'}, {'t_url': 'https://doc.media', 'language': 'en'}],
'feedback': [],
'privacy': [],
'translate_url': 'https://translate.bot',
'bugtracker_url': 'https://phabbot/',
'annotations': {
'wid': None,
'depre': False,
'by': None,
'exp': False,
'for': [],
'icon': None,
'available_languages': ['en'],
'ttype': None,
'rey': np.nan,
'api': None,
'dev_doc': [{'url': 'https://www.medial:t', 'language': 'en'}], 'user_url': [],
'feedback': [],
'privacy': [],
'translat': None,
'bugtracker': None},
'_schema': None,
'_language': 'en',
'origin': 'api',
'created_by': {'id': 10, 'username': 'JJMC89'},
'created_date': '2021-10-12T20:26:29.012245Z',
'modified_by': {
'id': 3,
'username': 'BD'
},
'modified_date': np.nan}
您必須回傳鍵的名稱,因為該值是未知的。您可以使用(也搜索嵌套字典):
nulls = []
for key in response:
if isinstance(response[key], dict):
nested_dict = response[key]
for key_ in nested_dict:
if nested_dict[key_] in [np.nan, [], None]:
nulls.append(key_)
elif response[key] in [np.nan, [], None]:
nulls.append(key)
Output:
['keywords',
'subtitle',
'id',
'alternates',
'username',
'by',
'sponsor',
'available_languages',
'api',
'feedback',
'privacy',
'wid',
'by',
'for',
'icon',
'ttype',
'rey',
'api',
'user_url',
'feedback',
'privacy',
'translat',
'bugtracker',
'_schema',
'modified_date']
uj5u.com熱心網友回復:
Null 不是 python 中的關鍵字。
因此,您必須將其轉換為 None 或“Null”
print([resp for resp in response.values() if resp == [] or resp == "Null" or resp == None])
uj5u.com熱心網友回復:
這里的錯誤是您僅將回應與空串列進行比較,[]而不與None. 基本上,您正在做的是詢問該值是空串列還是無,但僅此而已。您要做的是分離條件,例如
print([r for r in response.values() if not r or r is None])
捕獲一個空not r串列和布林值False。
或者,您可以使用該filter功能
list(filter(lambda x: not x, response.values()))
但這只會給你價值。如果你想要鑰匙,你可能想做:
print([k for k,v in response.items() if not v])
那將輸出
['keywords', 'subtitle', 'id', 'alternates', 'username', 'deprecated', 'by', 'experimental', 'sponsor', 'available_languages', 'api', 'feedback', 'privacy', '_schema', 'modified_date']
如果您還想支持嵌套的字典,單行可能不夠,但遞回可能會做到這一點。
def get_nones(resp, result):
... for k, v in resp.items():
... if not v:
... result.append(k)
... elif isinstance(v, dict):
... get_nones(v, result)
... return result
...
>>> r = []
>>> get_nones(response, r)
['keywords', 'subtitle', 'id', 'alternates', 'username', 'deprecated', 'by', 'experimental', 'sponsor', 'available_languages', 'api', 'feedback', 'privacy', 'wid', 'depre', 'by', 'exp', 'for', 'icon', 'ttype', 'rey', 'api', 'user_url', 'feedback', 'privacy', 'translat', 'bugtracker', '_schema', 'modified_date']
順便說一句,這是可行的,因為 Python 通過參考而不是值傳遞其串列。函式的最后一行
return result只是把它放在最后,但在遞回期間不需要更新值,因為它是被傳遞的同一個物件。
希望能幫助到你
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513528.html
