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

时间:2015-06-20 22:02:44

标签: python dictionary set iteration set-intersection

set_of_B_keydict_A是字典dict_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)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)

这样做的pythonic方式是什么?

这个很优雅,代码重复很少,但是在集合交集和排除中找到密钥需要额外的计算

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])

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

{{1}}

还是有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

你让自己变得太复杂了。您似乎正在为缺失的密钥创建默认值,因此以下内容要简单得多:

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来提供此处的设置。如果您使用的是Python 3,则dict.keys()已经是字典视图; dictionary views充当集合。