简化Python

时间:2015-11-07 21:36:49

标签: python list filter generator

我正在尝试过滤由多个词典组成的列表,用于无用的条目和非理想的字段。如果Mem['visibility'] == "redacted",则条目无效,然后应从列表中删除。当任何字段为空时,条目是非理想的,并且这些字段应该用0填充,或者如果Mem['~whatever~']是列表,在这种情况下,列表应该转换为包含所有对象的单个字符串那份清单。我写了以下代码:

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时,它会破坏我在以下函数中发生的数据库上的插入(上面函数中的成员列表等同于此成员中的成员):

def member(conn, cursor, member):
    try:
        if type(member) is not list:
            # TODO: Eventually implement single member insert here.
            print(member)
        cursor.executemany("INSERT INTO `Citizens` (`Handle`,`Org`,`Role`, "
                           "`Rank`,`Visibility`,`Stars`,`Type`) VALUES "
                           "(%(handle)s,%(sid)s,%(roles)s,%(rank)s,"
                           "%(visibility)s,%(stars)s,%(type)s);", member)
        conn.commit()

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

相反,要么制作列表的副本以进行迭代:

for mem in memberlist[:]:
    ...

或者将您想要的结果保存到另一个列表中并返回:

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