首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - List:如何从带有嵌套属性的字典列表中删除空属性?

Python - List:如何从带有嵌套属性的字典列表中删除空属性?
EN

Stack Overflow用户
提问于 2019-07-31 02:18:38
回答 3查看 120关注 0票数 2

因此,我有下面的字典列表,我已经用blankNoneempty values初始化了这些字典。检查列表的每个字典并检查一个属性是否符合这些条件并删除它们,正确的方法是什么。

代码语言:javascript
复制
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]  

我期望得到以下结果:

代码语言:javascript
复制
members = [{
            'title':  "Manager",
            'full_name': "John Doe",
    },{
            "member_id": 1,
            'full_name': "Jane Doe",
            'first_name': "Jane",
            'age': 10,
    },{...}]

但似乎我的代码正在返回相同的列表。我在这里做错什么了。谢谢

编辑:,如果我有嵌套的属性,比如地址,我该如何做同样的事情呢?

代码语言:javascript
复制
    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'
        }
}]
EN

回答 3

Stack Overflow用户

发布于 2019-07-31 02:25:24

一本字典可以用另一本字典来制作,而用字典的理解来过滤掉“假”值。

代码语言:javascript
复制
{k: v for k, v in d.items() if v}

看起来,您希望其他值像0' '一样被过滤掉,您可以将它们添加到条件中。

代码语言:javascript
复制
{k: v for k, v in d.items() if v not in (None, ' ', 0)}

然后,您可以使用列表理解与此相同的字典理解,以获得您所需要的。

代码语言:javascript
复制
[{k: v for k, v in d.items() if v not in (None, ' ', 0)} for d in members]

编辑:

用于筛选多个字典级别的递归函数。

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2019-07-31 04:29:12

一种使用递归的解决方案:

代码语言:javascript
复制
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)

指纹:

代码语言:javascript
复制
[{'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}]
票数 1
EN

Stack Overflow用户

发布于 2019-07-31 02:52:16

像这样吗?

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57282291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档