【问题标题】:Find all keys which match multiple values in dictionary查找匹配字典中多个值的所有键
【发布时间】:2020-03-15 09:41:56
【问题描述】:

我有一本像这样的字典。

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'}
                ]
    }

我想 yield 主题为“Python 编程”、“Java 编程”线性编程的 class_number

所以输出将是 CIS41A

【问题讨论】:

标签: python


【解决方案1】:

您可以使用collections.defaultdictset 交集执行以下操作:

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']

【讨论】:

    【解决方案2】:

    这是你想要的吗?

    from collections import defaultdict
    
    dic = {
        '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'},
            {"class_number": 'CIS41A', 'topic': 'Fourth Topic',
             'start_time': '9 PM', 'time_category': 'Evening'},
        ]
    }
    
    
    def gen(mandatory_topics: set):
        topic_dict = defaultdict(set)
        passed_classes = set()
        for class_ in dic['classes']:
            class_num = class_['class_number']
            topic_dict[class_num].add(class_['topic'])
            if topic_dict[class_num] >= mandatory_topics and class_num not in passed_classes:
                passed_classes.add(class_num)
                yield class_num
    
    
    topics = {'Python Programming', 'Java Programming', 'Linear Programming'}
    
    for item in gen(topics):
        print(item)
    

    输出:

    CIS41A
    

    我添加了第 5 个数据来测试极端情况。


    其他编辑

    我需要将主题作为单独的参数(如 *args)而不是作为列表或集合传递。如何更改此代码?

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

    def gen(*mandatory_topics: str):
        mandatory_topics = set(mandatory_topics)
    

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2019-05-13
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多