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

问题描述 投票:0回答:1

我想在Python中比较一个字典中的字符串列表和另一个字典列表。如果 hrefsecondary_list 是不可用的 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个回答
2
投票

你可以这样做。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)
© www.soinside.com 2019 - 2024. All rights reserved.