因此,我有下面的字典列表,我已经用blank、None或empty values初始化了这些字典。检查列表的每个字典并检查一个属性是否符合这些条件并删除它们,正确的方法是什么。
members = [{
"member_id": 0,
'title': "Manager",
'full_name': "John Doe",
'first_name': None,
'last_name': None,
'age': 0,
},{
"member_id": 1,
'title': " ",
'full_name': "Jane Doe",
'first_name': "Jane",
'last_name': None,
'age': 10,
},{...}]
[v for k, v in enumerate(members) if members[k] is not None] 我期望得到以下结果:
members = [{
'title': "Manager",
'full_name': "John Doe",
},{
"member_id": 1,
'full_name': "Jane Doe",
'first_name': "Jane",
'age': 10,
},{...}]但似乎我的代码正在返回相同的列表。我在这里做错什么了。谢谢
编辑:,如果我有嵌套的属性,比如地址,我该如何做同样的事情呢?
members = [{
"member_id": 0,
'title': "Manager",
'full_name': "John Doe",
'first_name': None,
'last_name': None,
'age': 0,
'address': {
'street_number': 123,
'street_name': None,
'city': "SF",
'state': "CA",
'zip': None,
'full_address': '123 Main Street, San Francisco, CA 94103'
}
},{
"member_id": 1,
'title': " ",
'full_name': "Jane Doe",
'first_name': "Jane",
'last_name': None,
'age': 10,
'address': {
'street_number': None,
'street_name': None,
'city': None,
'state': None,
'zip': None,
'full_address': '123 Main Street, San Francisco, CA 94103'
}
}]发布于 2019-07-31 02:25:24
一本字典可以用另一本字典来制作,而用字典的理解来过滤掉“假”值。
{k: v for k, v in d.items() if v}看起来,您希望其他值像0和' '一样被过滤掉,您可以将它们添加到条件中。
{k: v for k, v in d.items() if v not in (None, ' ', 0)}然后,您可以使用列表理解与此相同的字典理解,以获得您所需要的。
[{k: v for k, v in d.items() if v not in (None, ' ', 0)} for d in members]编辑:
用于筛选多个字典级别的递归函数。
def filter_dictionary(value):
if isinstance(value, dict):
return {k: filter_dictionary(v) for k, v in value.items() if v not in (None, ' ', 0)}
elif value not in (None, ' ', 0):
return value
[filter_dictionary(d) for d in members]发布于 2019-07-31 04:29:12
一种使用递归的解决方案:
members = [{
"member_id": 0,
'title': "Manager",
'full_name': "John Doe",
'first_name': None,
'last_name': None,
'age': 0,
'address': {
'street_number': 123,
'street_name': None,
'city': "SF",
'state': "CA",
'zip': None,
'full_address': '123 Main Street, San Francisco, CA 94103'
}
},{
"member_id": 1,
'title': " ",
'full_name': "Jane Doe",
'first_name': "Jane",
'last_name': None,
'age': 10,
'address': {
'street_number': None,
'street_name': None,
'city': None,
'state': None,
'zip': None,
'full_address': '123 Main Street, San Francisco, CA 94103'
}
}]
def traverse(m):
if isinstance(m, list):
return list(v for v in (traverse(i) for i in m) if v)
elif isinstance(m, dict):
return dict((k, v) for k, v in ((k, traverse(v)) for k, v in m.items()) if v)
else:
return None if isinstance(m, str) and not m.strip() else m
filtered_members = traverse(members)
from pprint import pprint
pprint(filtered_members)指纹:
[{'address': {'city': 'SF',
'full_address': '123 Main Street, San Francisco, CA 94103',
'state': 'CA',
'street_number': 123},
'full_name': 'John Doe',
'title': 'Manager'},
{'address': {'full_address': '123 Main Street, San Francisco, CA 94103'},
'age': 10,
'first_name': 'Jane',
'full_name': 'Jane Doe',
'member_id': 1}]发布于 2019-07-31 02:52:16
像这样吗?
members = [{
"member_id": 0,
'title': "Manager",
'full_name': "John Doe",
'first_name': None,
'last_name': None,
'age': 0,
},{
"member_id": 1,
'title': " ",
'full_name': "Jane Doe",
'first_name': "Jane",
'last_name': None,
'age': 10,
}]
for member in members:
toRemoveKeys = []
for key, value in member.items():
if value in (0, None, " "):
toRemoveKeys.append(key)
for key in toRemoveKeys:
del member[key]
print(members)https://stackoverflow.com/questions/57282291
复制相似问题