Python 在字典中查找与多个值匹配的所有键

Python 在字典中查找与多个值匹配的所有键,python,Python,我有一本像这样的字典 dics = {'classes':[ {"class_number":'CIS41A', 'topic':'Python Programming', 'start_time':'8:30 AM', 'time_category':'Early Morning'}, {"class_number":'CIS41A', 'topic':'Java Programming', 'start_time':'11:30 AM', 't

我有一本像这样的字典

dics = {'classes':[
            {"class_number":'CIS41A', 'topic':'Python Programming', 'start_time':'8:30 AM', 'time_category':'Early Morning'},
            {"class_number":'CIS41A', 'topic':'Java Programming', 'start_time':'11:30 AM', 'time_category':'Late Morning'} ,
            {"class_number":'CIS41J', 'topic':'Python Programming', 'start_time':'8 PM', 'time_category':'Evening'},
            {"class_number":'CIS41A', 'topic':'Linear Programming', 'start_time':'6 PM', 'time_category':'Evening'}
                ]
    }
我想给出主题为“Python编程”、“Java编程”和线性编程的类号


因此,输出将是CIS41A

from collections import defaultdict

check = {'Java Programming', 'Python Programming', 'Linear Programming'}

def gen(dics):
    topics = defaultdict(set)
    for klass in dics['classes']:
        topics[klass['class_number']].add(klass['topic'])
    for klass_number in topics:
        if topics[klass_number] & check == check:
            yield klass_number

>>> list(gen(dics))
['CIS41A']

您可以使用
collections.defaultdict
set
交叉点执行以下操作:

from collections import defaultdict

check = {'Java Programming', 'Python Programming', 'Linear Programming'}

def gen(dics):
    topics = defaultdict(set)
    for klass in dics['classes']:
        topics[klass['class_number']].add(klass['topic'])
    for klass_number in topics:
        if topics[klass_number] & check == check:
            yield klass_number

>>> list(gen(dics))
['CIS41A']
这就是你所说的吗

从集合导入defaultdict
dic={
“类”:[
{“类号”:“CIS41A”,“主题”:“Python编程”,
“开始时间”:“上午8:30”,“时间类别”:“清晨”},
{“类号”:“CIS41A”,“主题”:“Java编程”,
“开始时间”:“上午11:30”,“时间类别”:“上午晚些时候”},
{“类号”:“CIS41J”,“主题”:“Python编程”,
“开始时间”:“晚上8点”,“时间类别”:“晚上”,
{“类号”:“CIS41A”,“主题”:“线性规划”,
“开始时间”:“下午6点”,“时间类别”:“晚上”,
{“类别号”:“CIS41A”,“主题”:“第四主题”,
“开始时间”:“晚上9点”,“时间类别”:“晚上”,
]
}
def gen(必选主题:设置):
topic_dict=defaultdict(设置)
已通过\u类=集()
对于dic中的类['classes']:
类别编号=类别编号['类别编号']
topic_dict[class_num]。添加(class_u['topic'])
如果topic_dict[class_num]>=必选主题且class_num不在传递的类中:
已通过类。添加(类数)
产量等级
主题={'Python编程','Java编程','Linear编程'}
对于gen中的项目(主题):
打印(项目)
输出:

CIS41A
我添加了第5个数据,用于测试拐角情况


附加编辑 我需要将主题作为单个参数(如*args)传递,而不是作为列表或集合传递。如何根据需要更改此代码

更改参数并添加转换其类型的代码

def gen(*必选主题:str):
必选主题=设置(必选主题)
这就是你想要的吗

从集合导入defaultdict
dic={
“类”:[
{“类号”:“CIS41A”,“主题”:“Python编程”,
“开始时间”:“上午8:30”,“时间类别”:“清晨”},
{“类号”:“CIS41A”,“主题”:“Java编程”,
“开始时间”:“上午11:30”,“时间类别”:“上午晚些时候”},
{“类号”:“CIS41J”,“主题”:“Python编程”,
“开始时间”:“晚上8点”,“时间类别”:“晚上”,
{“类号”:“CIS41A”,“主题”:“线性规划”,
“开始时间”:“下午6点”,“时间类别”:“晚上”,
{“类别号”:“CIS41A”,“主题”:“第四主题”,
“开始时间”:“晚上9点”,“时间类别”:“晚上”,
]
}
def gen(必选主题:设置):
topic_dict=defaultdict(设置)
已通过\u类=集()
对于dic中的类['classes']:
类别编号=类别编号['类别编号']
topic_dict[class_num]。添加(class_u['topic'])
如果topic_dict[class_num]>=必选主题且class_num不在传递的类中:
已通过类。添加(类数)
产量等级
主题={'Python编程','Java编程','Linear编程'}
对于gen中的项目(主题):
打印(项目)
输出:

CIS41A
我添加了第5个数据,用于测试拐角情况


附加编辑 我需要将主题作为单个参数(如*args)传递,而不是作为列表或集合传递。如何根据需要更改此代码

更改参数并添加转换其类型的代码

def gen(*必选主题:str):
必选主题=设置(必选主题)

请用您尝试过的代码更新您的问题。这是否回答了您的问题?这本词典是怎样形成的?如果你对一个类有多个主题,你不应该这样做,让事情变得更糟。请用你尝试过的代码更新你的问题。这是否回答了你的问题?这本词典是怎样形成的?如果你对一个类有多个主题,你不应该这样做来让事情变得更糟。