如何测试列表中的每个元素(使用更复杂的逻辑)?

2024-09-27 07:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

注意:列表中的每个节点/掩码都是软件GUI中的实际节点,稍后我将尝试访问和操作这些节点。我认为现在将它们表示为字符串,会起到很好的作用。你知道吗

规则:

  1. 我必须在逻辑上比较列表中的每一项以得到结果
  2. 保留除仅连接到一种类型掩码的节点之外的所有节点,在本例中,需要排除node6和node7,并得到以下结果:

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

可选:我还想保留每个节点的一些信息,以便稍后使用,但我可以想出其他解决方案,所以这是可选的。你知道吗

我试着用嵌套for循环遍历每个元素,但这忽略了一些情况。我也尝试过使用groupby(),但是我想不通,因为我的Python知识有限。你知道吗


Tags: 列表节点动态掩码node1node5mylistnode2
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:25

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

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还存储与每个节点列表相关联的掩码。你知道吗

相关问题 更多 >

    热门问题