[英]How to check if a Dictionary CONTAINS the same items as another dictionary - Python
所以我有两个不同的字典,一个有点像“过滤器”,另一个是字典列表。
目前我正在做的是:
if all(item in tutor.items() for item in filters.items()):
问题是,我有一个程序列表,导师有能力教授。它可能是 Maple 或 Geogebra。 有很多不同的选择。 问题是,导师可能会在多个项目中任教。 因此,如果我在过滤器中指定程序,Maple。 我不希望它向我显示仅在 Maple 中任教的导师,但该程序所在的所有导师/不是程序列表的一部分。
所以我需要重写if all(item in tutor.items() for item in filters.items()):
类似if contains(item in tutor.items() for item in filters.items()):
但是这当然行不通。
导师字典看起来像这样:
{ 'age': 34,
'age_interval': '27+',
'car': 'No',
'course': '',
'educational_institution': 'Not set by tutor',
'email': 'ronaldreagon.rr@gmail.com',
'first_name': 'Ronald',
'fluent_danish': 'Not set by tutor',
'fluent_other': [''],
'gender': 'Not set by tutor',
'grade': '',
'gym_type': 'STX',
'has_second': False,
'hour_interval': None,
'hours': 0,
'id': 112306,
'inactive_reason': 'Jeg t▒r sgu ikke give ham forl▒b, s▒ g▒r ham inaktiv '
'-Elmar',
'last_name': 'Reagon Ravi Kumar',
'lat': 55.78319639999999,
'lat_alternative': 0,
'lng': 12.5151532,
'lng_alternative': 0,
'mobile_phone': '+45 50213154',
'more_courses': 'Yes',
'programs': 'Not set by tutor',
'status': 'Inactive',
'still_gym': 'Not set by tutor',
'subjects': 'None, ',
'tutor_address': 'Elektrovej 330 K5 2800 kongens lyngby',
'tutor_amount_of_students': 0,
'tutor_gym': 'Not set by tutor',
'tutor_qualification': 'Not set by tutor',
'tutor_uni': 'G▒r ikke p▒ en videreg▒ende uddannelse'}
{ 'age': 19,
'age_interval': '18 til 20',
'car': 'No',
'course': '',
'educational_institution': 'Not set by tutor',
'email': 'Katrinenm02@gmail.com',
'first_name': 'Katrine',
'fluent_danish': 'Not set by tutor',
'fluent_other': [''],
'gender': 'Not set by tutor',
'grade': '',
'gym_type': 'STX',
'has_second': False,
'hour_interval': None,
'hours': 0,
'id': 112356,
'inactive_reason': 'Inaktiv fordi hun er Kathrine',
'last_name': 'Mikha',
'lat': 55.653212,
'lat_alternative': 0,
'lng': 12.296957,
'lng_alternative': 0,
'mobile_phone': '53200337',
'more_courses': 'Yes',
'programs': 'Not set by tutor',
'status': 'Inactive',
'still_gym': 'Not set by tutor',
'subjects': 'None, ',
'tutor_address': 'Taastrup Have 8 st. TH',
'tutor_amount_of_students': 0,
'tutor_gym': 'Not set by tutor',
'tutor_qualification': 'Not set by tutor',
'tutor_uni': 'G▒r ikke p▒ en videreg▒ende uddannelse'}
{ 'age': 19,
过滤器只会指定相同的键和值。 例如
{
"gym_type" "STX"
}
这是通过对我们的 API 的 GET 请求完成的
@api.route("/test", methods=["GET"])
def validate_api_request():
try:
filters = request.json
return get_matching_tutors(filters)
except:
return error_response(400, "Bad request: error in body")
def get_matching_tutors(filters):
matching_tutors = []
for tutor in tutor_list:
if all(item in tutor.items() for item in filters.items()):
matching_tutors.append(tutor)
return jsonify(matching_tutors)
假设我在 API 调用中指定了这一点。
{
"programs": [
"Excel"
]
}
我会得到的,是所有符合能够在 Excel 任教要求的导师名单。 但是很多导师可能可以在 Excel 和另一个程序中任教。 但我只会得到只在 Excel 任教的导师。 所以预期的结果应该是这样的:
{
"age": 24,
"age_interval": "24 til 26",
"car": "Yes",
"course": "4. prioritet (Foretrækker fysisk)",
"educational_institution": "Københavns Universitet",
"email": "hdl543@alumni.ku.dk",
"first_name": "Ahmed",
"fluent_danish": "Yes",
"fluent_other": [
"Engelsk"
],
"gender": "Mand",
"grade": "7 til 8",
"gym_type": "STX",
"has_second": true,
"hour_interval": null,
"hours": 0,
"id": 134781,
"inactive_reason": "Blank",
"last_name": "Osman Mohammed",
"lat": 55.70321,
"lat_alternative": 55.68784609999999,
"lng": 12.530245,
"lng_alternative": 12.5696519,
"mobile_phone": "42313324",
"more_courses": "Yes",
"programs": [
"TI-Nspire",
"Geogebra",
"Wordmat",
"Excel",
"STATA"
],
"status": "Active",
"still_gym": "Jeg er færdig med gymnasiet",
"subjects": "Matematik B, Matematik C, Matematik Folkeskole, ",
"tutor_address": "Frederikssundsvej 54B, 2. th.",
"tutor_amount_of_students": 0,
"tutor_gym": "Frederiksberg Gymnasium",
"tutor_qualification": "Not set by tutor",
"tutor_uni": "Økonomi"
},
如您所见,我只指定了 Excel 但我有一个可以在 Excel 和其他程序中任教的导师。 所以我想我需要看看它是否“包含” API 调用中的指定程序
从长远来看,您可能希望使用 SQL 数据库,其中包含一个教师表和一个包含不同程序的表,它们之间存在多对多关系。
现在,我们可以创建一些辅助函数。 这不是绝对必要的,但它会使代码更易于阅读和维护。
def matches_filter(filter_value, tutor_value):
if isinstance(tutor_value, list):
# We want to treat this as a set of values to match
# instead of checking for equality
# Note: if you have to do this often, consider using sets instead of lists to store these values.
return set(filter_value).issubset(set(tutor_value))
return filter_value == tutor_value
def matches_all_filters(filter_dict, tutor):
return all(filter_key in tutor and matches_filter(filter_value, tutor[filter_key])
for filter_key, filter_value in filter_dict.items())
def get_matching_tutors(filters):
matching_tutors = [tutor for tutor in tutor_list
if matches_all_filters(filters, tutor]
return jsonify(matching_tutors)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.