繁体   English   中英

如何检查字典是否包含与另一个字典相同的项目 - Python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM