Python 元组之间的差异(全部或无)

Python 元组之间的差异(全部或无),python,set,tuples,Python,Set,Tuples,我有以下两套: house_1 = {('Gale', '29'), ('Horowitz', '65'), ('Galey', '24')} house_2 = {('Gale', '20'), ('Horowitz', '65'), ('Gale', '29')} 每个集合中的每个元组都包含表示一个人的属性。我需要找到house_1和house_2之间对称集差异的一个特例:只有当元组的所有元素不一致,而不是其中任何一个元素不一致时,才能确认差异 对于上述集合,house_1^ house_

我有以下两套:

house_1 = {('Gale', '29'), ('Horowitz', '65'), ('Galey', '24')}
house_2 = {('Gale', '20'), ('Horowitz', '65'), ('Gale', '29')}
每个集合中的每个元组都包含表示一个人的属性。我需要找到house_1和house_2之间对称集差异的一个特例:只有当元组的所有元素不一致,而不是其中任何一个元素不一致时,才能确认差异

对于上述集合,house_1^ house_2产生:

这很好。但是,在以下集合中:

house_1 = {('Gale', '24')}
house_2 = {('Gale', '29')}
使用house_1^house_2仍然可以产生:

{('Gale', '24'), ('Gale', '29')}
这不是我想要的。我需要仅当元组中的两个元素不匹配时才输出集合差。在本例中,Gale匹配,因此这两个元组不应出现在输出中

非常感谢您的任何见解

解决方案:

我编写了以下函数来解决此问题:

for counter_H1, member_H1 in enumerate(house_1):
    for counter_H2, member_H2 in enumerate(house_2):
        if (member_H1[0] == member_H2[0]) and (member_H1[1] == member_H2[1]):
            break

        if (member_H1[0] != member_H2[0]) and (member_H1[1] != member_H2[1]) and (counter_H2 == len(house_2) - 1):
            print(member_H1, member_H2)

您可以计算结果中名称的出现次数,并仅打印与计数为1的名称对应的元组:

from collections import defaultdict

count = defaultdict(list)

for x in house_1 ^ house_2:
    count[x[0]].append(x)
for v in count.values()
    if len(v) == 1:
        print(*v)

您的操作未指定。您似乎在假设某种隐式双射,其中一个集合的每个元素都与另一个集合的特定元素匹配。为什么“Gale”,“20”可以与第一组中的“Gale”,“29”匹配,但却包含在对称差异中?@user2357112我不明白你的最后一句话。你能详细说明吗?你应该使用理解。但是我认为你应该使用dicts,而不是set。@lostsoul29我认为user2357112的问题是为什么“Gale”,“20”应该是第一个区别。考虑到你想要的逻辑,它似乎应该与另一个“Gale”元组匹配。那么我想我根本不明白你想要什么。如果两个部分都需要匹配,那么为什么在第二个差异中“Gale”、“24”和“Gale”、“29”应该被视为匹配呢?我发现你的答案有一个问题。如果我改变元组元素的顺序,它就不起作用了。例如,如果集合现在是house_1={'24',Gale'}和house_2={'29',Gale'},那么即使Gale匹配,输出仍然是'29','Gale''24','Gale'。
from collections import defaultdict

count = defaultdict(list)

for x in house_1 ^ house_2:
    count[x[0]].append(x)
for v in count.values()
    if len(v) == 1:
        print(*v)