在Python 2.7中获得设置差异

时间:2017-02-05 04:24:15

标签: python python-2.7 set

我有两套:

set_A = ([('6',90), ('4',315), ('2', 135)])

set_B = (['A',90), ('B', 135), ('D', 240)])

我正在寻找一种方法来解决两者之间的差异,而不考虑单个数字和单个大写字母。

预期输出:([('4',315)])

这两次迭代都给了我:(['A',90), ('B', 135), ('D', 240)])

different = [item for item in set_B if item not in set_A]

different = set_B.difference(set_A)

我需要跟踪大写字母和单个数字。我不知道该怎么做。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:2)

我认为这就是你所追求的,如果不是,请澄清你的要求:

diff = set(a_item for a_item in set_A if a_item[1] not in [b_item[1] for b_item in set_B])

答案 1 :(得分:1)

您可以将它们转换为字典,因为字典键上的set.difference非常便宜:

>>> # Inverted dictionaries because you want to match the second element
>>> dict_A = {key: value for value, key in set_A}
>>> dict_B = {key: value for value, key in set_B}

>>> [(dict_A[key], key) for key in set(dict_A).difference(dict_B)]
[('4', 315)]

最后一步是你想要的差异,但它也将它转换回元组列表。

答案 2 :(得分:1)

你几乎是对的,假设我们只需要检查每个元组的第二个元素的重复,你可以简单地做:

对于Set A - Set B

different = [item for item in set_A if item[1] not in zip(*set_B)[1]]
different
[('4', 315)]

对于B组 - 设置A

different = [item for item in set_B if item[1] not in zip(*set_A)[1]]
different
[('D', 240)]

希望这有帮助!