如何在值检查后从字典列表中删除键匹配



下面是我的字典

myd = [
{
'name': 'Abc',
'id': '101',
'status': 'Success',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  },

{
'name': 'Abc',
'id': '101',
'status': 'Failed',
'lastModifiedDate': '2022-02-21 12:25:32:013302'  },

{
'name': 'def',
'id': '102',
'status': 'Failed',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  },

{
'name': 'ghi',
'id': '103',
'status': 'Success',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  },
{
'name': 'ijk',
'id': '110',
'status': 'Failed',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  },
{
'name': 'ijk',
'id': '110',
'status': 'Failed',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  }
]
  • 我需要提取的字典状态是'失败'只有
  • 如果id的状态为"成功",状态为"失败",那么字典必须从列表中删除
  • 只有失败必须在字典中添加
  • 如果两个id都失败了,那么它可以添加字典

预计出来

myd = [
{
'name': 'def',
'id': '102',
'status': 'Failed',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  },
{
'name': 'ijk',
'id': '110',
'status': 'Failed',
'lastModifiedDate': '2022-02-14 12:25:32:013302'  }
]

代码在

下面
#Remove duplicates
new = [dict(t) for t in {tuple(d.items()) for d in myd}]
for i in new:
if i['id] == 

您可以找到所有成功的并基于此进行筛选。使用带有id的字典作为键,使用字典作为值,并且只获取值以使结果唯一:

succeeded = {d["id"] for d in myd if d["status"] == "Success"}
result = list({d["id"]: d for d in myd if d["id"] not in succeeded}.values())

Result(pretty print):

[
{'id': '102',
'lastModifiedDate': '2022-02-14 12:25:32:013302',
'name': 'def',
'status': 'Failed'
},
{'id': '110',
'lastModifiedDate': '2022-02-14 12:25:32:013302',
'name': 'ijk',
'status': 'Failed'
}
]

请记住,这忽略了lastModifiedDate,但如果你想考虑到这一点,它是非常直接的。

使用集合来检查成员的速度。使用集合推导首先创建成功的id列表。重复你的myd列表并检查你的条件;如果满足,则向生成的id列表添加。将该id添加到已看到的id集中。

successful_ids = {x['id'] for x in myd if x['status'] == 'Success'}
seen_ids = set()
new_d = []
for x in myd:
if (x['status'] == 'Failed'
and x['id'] not in successful_ids
and x['id'] not in seen_ids):
new_d.append(x)
seen_ids.add(x['id'])
print(new_d)
# [{'name': 'def', 'id': '102', 'status': 'Failed', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}, {'name': 'ijk', 'id': '110', 'status': 'Failed', 'lastModifiedDate': '2022-02-14 12:25:32:013302'}]
counter = 0
newDict=[]
for i in myd:# this for is getting Failed ones into the newDict
if i['status'] == 'Failed':
newDict.append(myd[counter])
counter +=1
counter = 0
for i in newDict:#this for is destroying duplicates
if i['id'] in newDict[counter]['id']:
newDict.pop(counter)
counter +=1
print(newDict)

最简单但不是最快的解决方案是构建失败id的理解,并使用它为每个失败id选择一个字典

failed_ids = list(set([d['id'] for d in myd if d['status'] == 'Failed']))
result = []
for d in myd:
if d['id'] in failed_ids:
failed_ids.delete(d['id'])
result.append(d) 

或,没有理解式

result = []
failed_ids = []
for d in myd:
if d['id'] not in failed_ids and d['status'] == "Failed":
failed_ids.append(d['id'])
result.append(d)
myd = result 
print('results')
print(myd)

使用集合来检查已经包含的id将提高性能,但在小列表上不明显

刚刚意识到你不想要任何有一个或多个成功记录的东西,如果是这样的话,提前构建成功列表并收集已经包含在失败id列表中的

succ_ids = list(set([d['id'] for d in myd if d['status'] != 'Failed']))
fail_ids = []
result = [] 
for d in myd:     
if d['status'] not in succ_ids and d['status'] not in fail_ids:
result.append(d) 
fail_ids.append(d['id']) 

相关内容

  • 没有找到相关文章