【问题标题】:What is the Pythonic way to iterate over set intersection and exclusions?迭代集合交集和排除的 Pythonic 方法是什么?
【发布时间】:2015-06-20 22:02:43
【问题描述】:

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

或者有更好的方法吗?

【问题讨论】:

  • 你可以使用 dict.viewkeys 等。
  • 您真的在寻找 symmetric_difference 吗?
  • @PadraicCunningham 我不是在寻找 symmetric_difference,但 dict.viewkeys 领导帮助了!

标签: python dictionary set iteration set-intersection


【解决方案1】:

你把它弄得太复杂了。您似乎正在为丢失的键创建默认值,因此以下内容要简单得多:

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 充当集合。

【讨论】:

  • 谢谢!使用上面的代码,代码变得更快更简洁:)
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2022-01-02
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多