我想在Python中比较一个字典中的字符串列表和另一个字典列表。如果 href
在 secondary_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循环的实现可能会效率很低。
请问,上面的代码是否可以做得更高效、更紧凑?甚至更好的是,如果有我不知道的包存在的话?
你可以这样做。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)