gpt4 book ai didi

python - 简化 Python 中的列表过滤器

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:50 24 4
gpt4 key购买 nike

我正在尝试过滤由多个字典组成的列表,以查找无用的条目和非理想字段。如果 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 时,它会破坏我在以下函数中发生的数据库插入(上面函数中的 memberlist 相当于这个函数中的 member):

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()

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

最佳答案

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

相反,可以复制列表以进行迭代:

for mem in memberlist[:]:
...

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

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

关于python - 简化 Python 中的列表过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33588071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com