在Python中简化列表过滤器

在Python中简化列表过滤器,python,list,filter,generator,Python,List,Filter,Generator,我正在尝试筛选由多个字典组成的列表,以查找无用的条目和非理想字段。如果Mem['visibility']=“redated”,则条目无效,然后应从列表中删除。当任何字段为空时,条目都是不理想的,应该用0代替,或者如果Mem['~which~']是一个列表,则该列表应转换为一个字符串,其中包含该列表中的所有对象。为此,我编写了以下代码: class Filter: @staticmethod def members(memberlist): for Mem in

我正在尝试筛选由多个字典组成的列表,以查找无用的条目和非理想字段。如果
Mem['visibility']=“redated”
,则条目无效,然后应从列表中删除。当任何字段为空时,条目都是不理想的,应该用0代替,或者如果
Mem['~which~']
是一个列表,则该列表应转换为一个字符串,其中包含该列表中的所有对象。为此,我编写了以下代码:

class Filter:

    @staticmethod
    def members(memberlist):
        for Mem in memberlist:
            for Item in Mem:
                if not Mem[Item]:
                    Mem[Item] = 0
                if (type(Mem[Item]) is list):
                    Mem[Item] = ', '.join(Mem[Item])
            if(Mem['visibility'] == "redacted"):
                memberlist.remove(Mem)
        return(memberlist)
成员名单样本:

[
    {'roles': [],
     'rank': 'No SCB account',
     'type': 'main',
     'stars': 2,
     'visibility': 'visible',
     'sid': 'imperium',
     'handle': 'freakyeagle'
    },
    {'roles': [],
     'rank': 'Fleet Member',
     'type': 'main',
     'stars': 1,
     'visibility': 'visible',
     'sid': 'imperium',
     'handle': 'cadimus'},
    {'roles': [],
     'rank': 'Fleet Member',
     'type': 'main',
     'stars': 1,
     'visibility': 'visible',
     'sid': 'imperium',
     'handle': 'belleal'}
]
我如何使这尽可能简单/高效

此外,由于某种原因,当我从上面代码中的列表中删除无用的Mem时,它会中断我在数据库中的插入,这发生在以下函数中(上面函数中的memberlist相当于此函数中的member):


有人知道为什么会发生这种情况吗?

在对列表进行迭代时,不应该从列表中删除项目-当删除项目后跳过项目时,会出现意外行为

取而代之的是,制作列表的副本以进行迭代:

for mem in memberlist[:]:
    ...
或者将您想要的结果保存到另一个列表中并返回:

keep = []
for mem in memberlist:
    if ...:
       keep.append(mem)
return keep

顺便说一句,不要在遍历列表时从列表中删除项目-这会在跳过列表中的某些项目时产生意外的结果。最好的方法是什么?创建一个要删除的Mem列表,然后将其删除?可以在列表的副本上迭代(
,memberlist[:]:
),也可以将您希望保留的Mem添加到新列表中,然后返回该列表。只需一个注释;如果
Mem[Item]
是一个空列表,您将把它转换为
0
,因为
如果不是Mem[Item]:
将为空列表返回True。如果您没有bug或问题,并且您所追求的只是代码是否有效,那么最好在:-)上提问
keep = []
for mem in memberlist:
    if ...:
       keep.append(mem)
return keep