【问题标题】:How to efficiently compare a list of string within a dictionaries against another list of dictionaries in Python?如何有效地将字典中的字符串列表与 Python 中的另一个字典列表进行比较?
【发布时间】:2020-08-07 20:09:54
【问题描述】:

我想将字典中的字符串列表与 Python 中的另一个字典列表进行比较。如果secondary_list中的href在main_list中不可用,则href将附加到main_list中。

基于这个需求,实现了下面的代码。

main_list = [
    {'href': 'red'},
    {'href': 'yellow'},
    {'href': 'yellow'},
]

secondary_list = [
    {'href': 'yellow'},
    {'href': 'redf'},
    {'href': 'blue'},
]
for g in secondary_list:

    if not any(d.get('href', None) == g["href"] for d in main_list):
        main_list.append({'href': g["href"]})

但是,假设我们在两个字典中都有一个非常大的列表,那么使用两个 for 循环的实现可能效率低下。

请问上面的代码能否更高效、更紧凑?更好的是,如果存在我不知道的包?

【问题讨论】:

    标签: python list performance dictionary for-loop


    【解决方案1】:

    您可以执行以下操作,O(n) 复杂性:

    main_set = {frozenset(g.items()) for g in main_list}
    secondary_set = {frozenset(g.items()) for g in secondary_list}
    
    main_list.extend(dict(g) for g in secondary_set - main_set)
    print(main_list)
    

    输出

    [{'href': 'red'}, {'href': 'yellow'}, {'href': 'yellow'}, {'href': 'blue'}, {'href': 'redf'}]
    

    这个想法是创建一组冻结字典frozenset(g.items()) 找出差异并转换回字典。您可以将frozenset 视为一个可散列集。

    对于您的情况,特别是对于所有密钥都相同的单键字典,您可以这样做:

    main_set = {v for d in main_list for v in d.values()}
    secondary_set = {v for d in secondary_list for v in d.values()}
    
    main_list.extend({"href": v} for v in (secondary_set - main_set))
    print(main_list)
    

    【讨论】:

    • 有趣的建议,将其降低到 O(n) 复杂度。我当时仍然没有大的 dic,因此无法比较执行时间的差异。但是,我稍后会通过应用您提出的解决方案来更新速度增益。
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多