Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地比较字典中的字符串列表与Python中的另一个字典列表?_Python_List_Performance_Dictionary_For Loop - Fatal编程技术网

如何有效地比较字典中的字符串列表与Python中的另一个字典列表?

如何有效地比较字典中的字符串列表与Python中的另一个字典列表?,python,list,performance,dictionary,for-loop,Python,List,Performance,Dictionary,For Loop,我想将字典中的字符串列表与Python中的另一个字典列表进行比较。如果次要列表中的href在主列表中不可用,则href将被追加到主列表中 基于此需求,实现了以下代码 main_list = [ {'href': 'red'}, {'href': 'yellow'}, {'href': 'yellow'}, ] secondary_list = [ {'href': 'yellow'}, {'href': 'redf'}, {'href': 'bl

我想将字典中的字符串列表与Python中的另一个字典列表进行比较。如果
次要列表中的
href
主列表中不可用,则
href
将被追加到
主列表中

基于此需求,实现了以下代码

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循环的实现可能效率低下


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

您可以执行以下操作,
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())
找出差异并转换回字典。您可以将其视为可哈希集

对于您的情况,尤其是单键字典,其中所有键都相同,您可以执行以下操作:

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)

字典是否总是有一个单键href?对于这种特殊情况,通过将其简化为O(n)复杂度,只提供一个单键HREFinInteresting建议。我当时仍然没有大的dic,因此无法比较执行时间的差异。但是,稍后我将通过应用您提出的解决方案来更新速度增益。