分组元素的圆形联合

时间:2018-04-25 13:56:25

标签: python union

抱歉,我的标题不清楚,因此也可能是重复的......

我有二十多封信件,我想将这些二重奏分组成更大的名单,以封闭的方式分享信件。

Input
[(X, Y), (X, Z), (Y, Z), (A, B), (B, C), (A, C)]

Output
[(X, Y, Z), (A, B, C)]


Input
[(X, Y), (X, Z), (A, Z), (A, B), (B, C), (A, C)]

Output
[(X, Y), (X, Z), (A, Z), (A, B, C)]


Input
[(X, Y), (X, C), (Y, C), (A, B), (B, C), (A, C)]

Output
[(X, Y, C), (A, B, C)]

输出的顺序并不重要。我给出了元组列表的例子,但它可以是另一种数据结构。

当前的解决方案是if / else语句的混乱......我非常确定我不知道的某些功能可以做到这一点......你能指出我正确的方向吗?

感谢。

编辑:

真的很遗憾我无法用言语来形容这个问题......示例更加清晰。评论中的那个:

Input
[(X, Y), (X, C), (Y, C), (A, B), (B, C), (A, C), (B, D)]

Output
[(X, Y, C), (A, B, C), (B, D)]

1 个答案:

答案 0 :(得分:1)

此功能可以完成工作,但不会保留顺序:

a = [('X', 'Y'), ('X', 'Z'), ('Y', 'Z'), ('A', 'B'), ('B', 'C'), ('A', 'C')]
b = [('X', 'Y'), ('X', 'C'), ('Y', 'C'), ('A', 'B'), ('B', 'C'), ('A', 'C'), ('B', 'D')]

def combine(array):
    result = []

    for i, j in zip(array, array[1:]):
        if any(k in i for k in j):
            new = tuple(set(i+j))
            if not result:
                result.append(new)
            else:
                result.append(tuple(set(result.pop() + new)))
        else:
            result.append(j)

    return result

print(combine(a))
print(combine(b))

#[('Y', 'X', 'Z'), ('A', 'C', 'B')]
#[('Y', 'X', 'C'), ('A', 'C', 'B'), ('B', 'D')]