如果键的所有值都为空,如何从列表中删除字典

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 值会触发过滤或删除。如果这不是问题,您可以进一步简化我提供的示例。