迭代集合交集和排除的 Pythonic 方法是什么?

What is the Pythonic way to iterate over set intersection and exclusions?

set_of_A_keyset_of_B_key是字典dict_Adict_B的两组键。我想对以下三组中的键的字典值进行操作:

(set_of_A_key & set_of_B_key), (set_of_A_key - set_of_B_key)(set_of_B_key - set_of_A_key)

执行此操作的 pythonic 方法是什么?

这个很优雅,代码重复很少,但是会进行额外的计算以找到集合交集和排除中的键

only_A = (set_of_A_key - set_of_B_key)
only_B = (set_of_B_key - set_of_A_key)

for key in (set_of_A_key | set_of_B_key):
    if key in only_A:
        A_val = dict_A[key]
        B_val = 0
    elif key in only_B:
        B_val = dict_B[key]
        A_val = 0
    else:
        B_val = dict_B[key]
        A_val = dict_A[key]
    some_function(A_val,B_val)

或者这个速度更快但存在代码重复

for key in (set_of_A_key - set_of_B_key):
     some_function(dict_A[key],0) 
for key in (set_of_B_key - set_of_A_key):
     some_function(0,dict_B[key]) 
for key in (set_of_A_key & set_of_B_key):
     some_function(dict_A[key],dict_B[key])

或者有更好的方法吗?

你把事情搞得太复杂了。您似乎正在为缺少的键创建默认值,因此下面要简单得多:

for key in dict_A.viewkeys() | dict_A.viewkeys():
    some_function(dict_A.get(key, 0), dict_B.get(key, 0))

使用 dict.get() 函数替换缺失键的默认值。

请注意,我使用了 dict.viewkey() dictionary view to provide the set here. If you are using Python 3, then dict.keys() is a dictionary view already; dictionary views 作为集合。