所以我有兩個不同的字典,一個有點像“過濾器”,另一個是字典串列。
目前我正在做的是:
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': '[email protected]',
'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': '[email protected]',
'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": "[email protected]",
"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呼叫中的指定程式
uj5u.com熱心網友回復:
從長遠來看,您可能希望使用 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410056.html
標籤:
上一篇:Python類中的字典邏輯
