如果键的所有值都为空,如何从列表中删除字典
How to remove dictionary from a list if all values of keys are null
输出:
{
"id": 243,
"name": "DC KD Postpaid",
"display_name": "DC KD Postpaid disp.",
"asigned": [
{
"id": null,
"user": null,
"email": null,
"phone": null,
"fullname": null
},
{
"id": 526,
"user": "Suraj6",
"email": "dckd@gmail.com",
"phone": "9865325285",
"fullname": "Suraj"
}
]
}
CentresAssigned 序列化器
class CentresAssigned(serializers.ModelSerializer):
asigned = serializers.SerializerMethodField()
class Meta:
model = Centers
fields = ["id", "name", "display_name", "asigned"]
def get_asigned(self, obj):
if obj.asigned:
return PanelUserSerializerCopy(obj.asigned, many=True).data
else:
return None
PanelUserSerializerCopy
class PanelUserSerializerCopy(serializers.ModelSerializer):
id = serializers.SerializerMethodField()
user = serializers.SerializerMethodField()
email = serializers.SerializerMethodField()
phone = serializers.SerializerMethodField()
fullname = serializers.SerializerMethodField()
class Meta:
model = panel_models.PanelUser
fields = (
"id",
"user",
"email",
"phone",
"fullname"
)
def get_id(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.id
else:
return None
def get_user(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.username
else:
return None
def get_email(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.email
else:
return None
def get_phone(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.phonenumber
else:
return None
def get_fullname(self, obj):
return obj.user.fullname if obj.user and obj.user.usergroup == 'CCPartner' else None
在输出中,所有键的第一个字典包含空值。所以我不希望这个出现在列表中。这该怎么做。我正在学习 Python 和 DRF,我搜索并找到了 items() 和 del() 方法,但如何在此处应用。我有困难。任何帮助,将不胜感激。谢谢!!
如果你想根据 if all 其值为 null 来过滤字典:
if all(d.values()):
# keep d
# otherwise throw out
如果要根据 any 的值是否为 null 来过滤字典:
if any(d.values()):
# keep d
# otherwise throw out
此外,如果您正在使用 JSON
,您可能需要考虑使用 built-in json
包,它将 JSON
转换为 Python 对象(包括自动将 Javascript 的 null
转换为 Python 的 None
):
In [1]: import json
In [2]: s = """{"id": null, "user": null, "email": null, "phone": null, "fullname": null}"""
In [3]: json.loads(s)
Out[3]: {'id': None, 'user': None, 'email': None, 'phone': None, 'fullname': None}
无论如何,我将您的 JSON 数据加载到名为 payload
的 Python 字典中,这是一个示例:
In [6]: [d for d in payload['asigned'] if all(d.values())]
Out[6]:
[{'id': 526,
'user': 'Suraj6',
'email': 'dckd@gmail.com',
'phone': '9865325285',
'fullname': 'Suraj'}]
(注意 'asigned' 键拼错了——应该是 'assigned')
最简单的方法是将原始列表分配给过滤后的列表:
some_list = [{'a': None, 'b': None}, {'a': 0, 'b': 0}]
filtered_list = filter(lambda d: all(True if i is not None else False for i in d.values()),
some_list)
您还可以按索引遍历每个字典并删除错误值:
for i in range(len(some_list)):
if all(True if v is not None else False for v in some_list[i].values()):
del(some_list[i])
请注意,在我的 all
检查中,我正在检查该值是否明确 None
。否则,您可能会得到 not-none 但像 ""
或 []
这样的 Falsey 值会触发过滤或删除。如果这不是问题,您可以进一步简化我提供的示例。
输出:
{
"id": 243,
"name": "DC KD Postpaid",
"display_name": "DC KD Postpaid disp.",
"asigned": [
{
"id": null,
"user": null,
"email": null,
"phone": null,
"fullname": null
},
{
"id": 526,
"user": "Suraj6",
"email": "dckd@gmail.com",
"phone": "9865325285",
"fullname": "Suraj"
}
]
}
CentresAssigned 序列化器
class CentresAssigned(serializers.ModelSerializer):
asigned = serializers.SerializerMethodField()
class Meta:
model = Centers
fields = ["id", "name", "display_name", "asigned"]
def get_asigned(self, obj):
if obj.asigned:
return PanelUserSerializerCopy(obj.asigned, many=True).data
else:
return None
PanelUserSerializerCopy
class PanelUserSerializerCopy(serializers.ModelSerializer):
id = serializers.SerializerMethodField()
user = serializers.SerializerMethodField()
email = serializers.SerializerMethodField()
phone = serializers.SerializerMethodField()
fullname = serializers.SerializerMethodField()
class Meta:
model = panel_models.PanelUser
fields = (
"id",
"user",
"email",
"phone",
"fullname"
)
def get_id(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.id
else:
return None
def get_user(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.username
else:
return None
def get_email(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.email
else:
return None
def get_phone(self, obj):
if obj.user and obj.user.usergroup == 'CCPartner':
return obj.user.phonenumber
else:
return None
def get_fullname(self, obj):
return obj.user.fullname if obj.user and obj.user.usergroup == 'CCPartner' else None
在输出中,所有键的第一个字典包含空值。所以我不希望这个出现在列表中。这该怎么做。我正在学习 Python 和 DRF,我搜索并找到了 items() 和 del() 方法,但如何在此处应用。我有困难。任何帮助,将不胜感激。谢谢!!
如果你想根据 if all 其值为 null 来过滤字典:
if all(d.values()):
# keep d
# otherwise throw out
如果要根据 any 的值是否为 null 来过滤字典:
if any(d.values()):
# keep d
# otherwise throw out
此外,如果您正在使用 JSON
,您可能需要考虑使用 built-in json
包,它将 JSON
转换为 Python 对象(包括自动将 Javascript 的 null
转换为 Python 的 None
):
In [1]: import json
In [2]: s = """{"id": null, "user": null, "email": null, "phone": null, "fullname": null}"""
In [3]: json.loads(s)
Out[3]: {'id': None, 'user': None, 'email': None, 'phone': None, 'fullname': None}
无论如何,我将您的 JSON 数据加载到名为 payload
的 Python 字典中,这是一个示例:
In [6]: [d for d in payload['asigned'] if all(d.values())]
Out[6]:
[{'id': 526,
'user': 'Suraj6',
'email': 'dckd@gmail.com',
'phone': '9865325285',
'fullname': 'Suraj'}]
(注意 'asigned' 键拼错了——应该是 'assigned')
最简单的方法是将原始列表分配给过滤后的列表:
some_list = [{'a': None, 'b': None}, {'a': 0, 'b': 0}]
filtered_list = filter(lambda d: all(True if i is not None else False for i in d.values()),
some_list)
您还可以按索引遍历每个字典并删除错误值:
for i in range(len(some_list)):
if all(True if v is not None else False for v in some_list[i].values()):
del(some_list[i])
请注意,在我的 all
检查中,我正在检查该值是否明确 None
。否则,您可能会得到 not-none 但像 ""
或 []
这样的 Falsey 值会触发过滤或删除。如果这不是问题,您可以进一步简化我提供的示例。