如何与其他json对象的值进行比较

2024-05-20 15:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个清单:

a_list

[{'score': 60, 'credit': 5, 'class': 'A01', 'subject': 'math'}, 
{'score': 70, 'credit': 5, 'class': 'A01', 'subject': 'music'}, 
{'score': 65, 'credit': 5, 'class': 'B01', 'subject': 'science'}, 
{'score': 35, 'credit': 5, 'class': 'C02', 'subject': 'math'}]

我从db查询(django)得到一个列表,每个subject都有自己的pass_mark

pass_list =  ClassData.objects.values('subject','pass_mark')

pass_list

[{'pass_mark': 50, 'subject_all': u'math'}, 
{'pass_mark':70, 'subject_all': u'science'}, 
{'pass_mark': 70, 'subject_all': u'music'}] 

我必须比较a_list来检查pass_mark是否高于pass_list

所以结果列表是:

[{'score': 60, 'credit': 5, 'class': 'A01', 'subject': 'math'}, 
{'score': 70, 'credit': 5, 'class': 'A01', 'subject': 'music'}]

我的方法是:

result_list = []
for a in a_list:
    check = [x for x in pass_list if x['subject_all'] == a['subject']]
    if a['score'] >= check[0]['pass_mark']:
        result_list.append(a)
print result_list

我想知道有没有更快更好的方法
因为a_list将是一个大的未来


Tags: 方法列表musicmathpassresultalllist
1条回答
网友
1楼 · 发布于 2024-05-20 15:28:32

keys是主语,值是scores的地方做一个dict:

l = [{'score': 60, 'credit': 5, 'class': 'A01', 'subject': 'math'},
     {'score': 70, 'credit': 5, 'class': 'A01', 'subject': 'music'},
     {'score': 65, 'credit': 5, 'class': 'B01', 'subject': 'science'},
     {'score': 35, 'credit': 5, 'class': 'C02', 'subject': 'math'}]

l2 = [{'pass_mark': 50, 'subject_all': u'math'},
      {'pass_mark': 70, 'subject_all': u'science'},
      {'pass_mark': 70, 'subject_all': u'music'}]

sub = {dct["subject_all"]: dct["pass_mark"] for dct in l2}

result = [dct for dct in l if dct["score"] >= sub[dct["subject"]]]

print(result)

输出:

[{'credit': 5, 'score': 60, 'class': 'A01', 'subject': 'math'}, {'credit': 5, 'score': 70, 'class': 'A01', 'subject': 'music'}]

只需通过l2构建dict,然后通过l构建dict,并在其他地方使用常量功,因此解决方案是O(n),而不是您自己的二次方法。理想情况下,如果您能够首先创建subdict,这将是最好的方法。你知道吗

相关问题 更多 >