我有一个字典,并希望保持None值,但删除值与"以及任意组合的值"‘s
我有以下字典:
{'UserName': '',
'Location': [{'City': '',
'Country': 'Japan',
'Address 1': ' ',
'Address 2': ' '}],
'PhoneNumber': [{'Number': '123-456-7890', 'ContactTimes': '', 'PreferredLanguage': None}],
'EmailAddress': [{'Email': 'test@test.com', 'Subscribed': None}],
'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
}
预期结果:
{
'Location': [{
'Country': 'Japan',
}],
'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}],
'EmailAddress': [{'Email': 'test@test.com', 'Subscribed': None}],
'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
}
我有这个功能,它的部分工作,但我不知道如何删除键的额外空间。
def delete_junk(_dict):
for key, value in list(_dict.items()):
if isinstance(value, dict):
delete_junk(value)
elif value == '':
del _dict[key]
elif isinstance(value, list):
for v_i in value:
if isinstance(v_i, dict):
delete_junk(v_i)
return _dict
你的方法是合理的;我也认为用递归定义一个函数是我解决这个问题的方法。我将使用.isspace()
来帮助。
def delete_junk(d):
"""
Recursively removes empty strings or strings consisting only of whitespaces
from the input dictionary and its nested dictionaries and lists.
"""
if isinstance(d, dict):
return {k: remove_empty_strings(v) for k, v in d.items() if v != "" and not str(v).isspace()}
elif isinstance(d, list):
return [remove_empty_strings(v) for v in d if v != "" and not str(v).isspace()]
else:
return d
i = {'UserName': '',
'Location': [{'City': '',
'Country': 'Japan',
'Address 1': ' ',
'Address 2': ' '}],
'PhoneNumber': [{'Number': '123-456-7890', 'ContactTimes': '', 'PreferredLanguage': None}],
'EmailAddress': [{'Email': 'test@test.com', 'Subscribed': None}],
'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
}
output_dict = delete_junk(i)
print(output_dict)
# Output: {'Location': [{'Country': 'Japan'}],
# 'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}],
# 'EmailAddress': [{'Email': 'test@test.com', 'Subscribed': None}],
# 'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]}
单字典推导意味着递归调用:
def delete_junk(d):
return {k: [delete_junk(i) for i in v] if isinstance(v, list) else v
for k, v in d.items()
if not isinstance(v, str) or v.strip()}
print(delete_junk(dct))
{'EmailAddress': [{'Email': 'test@test.com', 'Subscribed': None}],
'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}],
'Location': [{'Country': 'Japan'}],
'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}]}