根据您在评论中的注释,我修改了代码。
假设这些图是有向无环图,并且目标是消除列表中其他序列的子序列。
我们可以不再查看每个序列的长度,而是仅丢弃任何是其他序列子集的序列。为此,我们可以使用
str
子集运算符。
print(f"Initial list: {edges_1}")
keepers = []
for edge in edges_1:
other_edges = edges_1[:]
other_edges.remove(edge)
print(f"Test {edge} against {other_edges}")
for rest in other_edges:
if edge in rest:
print(f"Found match {edge} -> {rest}")
break
else:
keepers.append(edge)
print(f"No greater matches found for {edge}")
print(f"The longest edges: {keepers}")
这段代码并不是最高效、也不是最整洁的,但它能突出基本的解决问题机制。
旧答案:在没有更多 OP 描述的情况下解决。
如果你可以始终假设顶点之间的边由“::”表示,那么你可以使用一些简单的字符串处理来获取每个序列的长度。
这个解决方案假设你总是想要最长的两个序列。
edges_1 = ['a::b::c', 'a::b', 'a', 'a::d','a::d::e', 'a::d::e::f']
edges_2 = ['a', 'b']
def print_longest_two_sequences(edges):
links = [edge.split("::") for edge in edges]
links.sort(key=len, reverse=True)
links = ["::".join(edge) for edge in links]
print(links[:2])
print_longest_two_sequences(edges_1)
print_longest_two_sequences(edges_2)
'a::b::c'
。 - Nir Alfasi