我有一个清单,基本上是这样的:
[[A, B], [A, C], [D,E]]其中A,B,C,D和E是电路的节点。当两个节点放在一个列表中时,它们具有相同的势,所以在我的例子中,A和B,A和C,最后,D和E基本上是相等的。
因为A和B,但也是A和C是相等的,所以B和C应该相等。
我想要做的是:我需要创建一个列表,它基本上如下所示:
[[A, B, C], [D,E]]因此,应该将基本上相等的所有节点汇总成一个列表,并将每个相同节点的列表放到最后一个列表中,就像上面的列表一样。我正在考虑使用集合,例如使用交叉和联合,但我还没有弄清楚。
也许有人可以提前帮忙和感谢!
编辑到目前为止这是我的尝试:
wireEnds = self.wireEnds.copy()
for currentNodePair in wireEnds:
foundInSubSet = False
print("currentNodePair:",currentNodePair)
for subSet in self.commonNodes:
print("subSet:",subSet)
if (currentNodePair[0] in subSet) or (currentNodePair[1] in subSet):
subSet.add(currentNodePair[0])
subSet.add(currentNodePair[1])
print("Adding to subset:",currentNodePair)
foundInSubSet = True
continue
if not foundInSubSet:
print("Not found, creating new subSet:",currentNodePair)
self.commonNodes.append({currentNodePair[0], currentNodePair[1]})注意,我使用的是集合而不是子列表,因为我不想在子列表中重复。
发布于 2022-01-31 15:58:24
由于您所拥有的是一个图,并且您想要找到连通元件,所以可以使用Networkx,它具有一个实现union find数据结构的方法:
from networkx.utils.union_find import UnionFind
sets = UnionFind()
for gp in lst:
sets.union(*gp)
out = [list(s) for s in sets.to_sets()]
[['A', 'B', 'C'], ['E', 'D']]发布于 2022-02-02 21:31:07
好的,谢谢@enke,这比我的解决方案容易得多,但也许你可以看看!
def version_3(list_in):
output = [set(list_in[0])]
for sublist in list_in[1:]:
current_set = set(sublist)
found_in = []
for group in output:
current_group = set(group)
if current_set.intersection(current_group):
found_in.append(current_group)
if found_in:
for group in found_in:
output.remove(group)
current_set = current_set.union(group)
output.append(current_set)
else:
output.append(set(sublist))
return outputhttps://stackoverflow.com/questions/70928350
复制相似问题