0

我有一个动态生成的列表:

myList = [[node1, mask1],
          [node2, mask1], 
          [node3, mask1], 
          [node4, mask2], 
          [node5, mask2], 
          [node6, mask3],
          [node7, mask4],
         ]

注意:列表中的每个节点/掩码都是软件 GUI 中的实际节点,我稍后会尝试访问和操作。我认为现在将它们表示为字符串,可以很好地达到目的。

规则:

  1. 我必须在逻辑上将列表中的每个项目相互比较才能得到结果;
  2. 保留除仅与一种掩码有连接的节点外的所有节点,在此示例中,需要排除 node6 和 7,并得到以下结果:

    newList = [[node1, node2, node3], [node4, node5]]
    

可选:我还想将每个节点的一些信息保留在已连接的掩码中,以便稍后使用 - 但我可以想到其他解决方案,因此它是可选的。

我尝试使用嵌套的 for 循环遍历每个元素,但这会遗漏某些情况。我也尝试过使用groupby(),但我无法弄清楚,因为我的 Python 知识有限。

4

1 回答 1

1

您可以使用 adefaultdict将具有相同掩码的所有节点分组到一个列表中:

from collections import defaultdict

myList = [['node1', 'mask1'],
          ['node2', 'mask1'], 
          ['node3', 'mask1'], 
          ['node4', 'mask2'], 
          ['node5', 'mask2'], 
          ['node6', 'mask3'],
          ['node7', 'mask4'],
         ]

# create a hash with key as mask
# and value as list of nodes with that mask 
node_gps = defaultdict(list)
for item in myList:
    node = item[0]
    mask = item[1]
    node_gps[mask].append(node)

print node_gps
# =>  {'mask4': ['node7'], 
#      'mask1': ['node1', 'node2', 'node3'], 
#      'mask3': ['node6'], 
#      'mask2': ['node4', 'node5']}


# filter out nodes with only one match
# using list comprehension
newList =  [v for k, v in node_gps.items() if len(v) > 1]

# or using for loops
newList = []
# iterate over each mask, nodes pair in node_gps
for mask, nodes in node_gps.items():
    # append a node_list if it has more than 1 node
    if len(nodes) > 1:
        newList.append(nodes)

print newList
# [['node1', 'node2', 'node3'], 
#  ['node4', 'node5']]

node_gpsdict 还存储与每个节点列表关联的掩码。

于 2017-01-02T18:01:01.357 回答