首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >操作以汇总和缩小带有子列表的列表。

操作以汇总和缩小带有子列表的列表。
EN

Stack Overflow用户
提问于 2022-01-31 15:19:16
回答 2查看 54关注 0票数 -2

我有一个清单,基本上是这样的:

代码语言:javascript
复制
[[A, B], [A, C], [D,E]]

其中A,B,C,D和E是电路的节点。当两个节点放在一个列表中时,它们具有相同的势,所以在我的例子中,A和B,A和C,最后,D和E基本上是相等的。

因为A和B,但也是A和C是相等的,所以B和C应该相等。

我想要做的是:我需要创建一个列表,它基本上如下所示:

代码语言:javascript
复制
[[A, B, C], [D,E]]

因此,应该将基本上相等的所有节点汇总成一个列表,并将每个相同节点的列表放到最后一个列表中,就像上面的列表一样。我正在考虑使用集合,例如使用交叉和联合,但我还没有弄清楚。

也许有人可以提前帮忙和感谢!

编辑到目前为止这是我的尝试:

代码语言:javascript
复制
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]})

注意,我使用的是集合而不是子列表,因为我不想在子列表中重复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-31 15:58:24

由于您所拥有的是一个图,并且您想要找到连通元件,所以可以使用Networkx,它具有一个实现union find数据结构的方法:

代码语言:javascript
复制
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']]
票数 1
EN

Stack Overflow用户

发布于 2022-02-02 21:31:07

好的,谢谢@enke,这比我的解决方案容易得多,但也许你可以看看!

代码语言:javascript
复制
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 output
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70928350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档