抱歉,我的标题不清楚,因此也可能是重复的......
我有二十多封信件,我想将这些二重奏分组成更大的名单,以封闭的方式分享信件。
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)]
答案 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')]