如果键的所有值都为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"
}
]
}

中心分配的序列化程序

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

PanelUserSerializer复制

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((方法,但在这里如何应用。我遇到困难了。如有任何帮助,我们将不胜感激。非常感谢。

最简单的方法是将原始列表分配给过滤列表:

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。否则,您可能会得到像""[]这样的Falsey值来触发筛选或删除。如果这不是一个问题,你可以简化我提供的样品,甚至更多。

如果你想根据If过滤字典,所有的值都为空:

if all(d.values()):
# keep d
# otherwise throw out

如果你想根据的任何值是否为空来过滤字典:

if any(d.values()):
# keep d
# otherwise throw out

此外,如果您使用JSON,您可能需要考虑使用内置的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"(

最新更新