下面是我的字典
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'])