-1

我们有一个二维列表(对于这个例子,我们用唯一的 6 个节点和 3 个掩码填充它)

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

现在我需要以某种方式相互测试并生成一个新列表,将每个连接到掩码的节点放在单独的 [] 中,这样我以后可以轻松访问它,但我还需要过滤像“node6”这样的节点,因为“ node6" 只连接到一个掩码(在我们的例子中只连接到 "mask3")

基本上我希望我的新列表看起来像这样:

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

这已经让我头疼了几个小时了.. 提前谢谢你!

注意:很高兴看到最有效的方法是什么

编辑1:我尝试了什么:

myList =[[node1, masks1][node2, mask1] etc..] #this is earlier dynamically populated with nodes/masks
newList= []
for i in range(len(myList)):
    for j in range(len(myList[i])):
        try:
            if myList[i][0] in newList:
                pass 
            elif myList[i][1] == myList[j][1] and len(myList) > 1:
                newList.append([db[i][0]])
                break
        except IndexError:
            #print 'passed error'
            pass

我知道这对我的要求没有多大意义..我以前的尝试没有保存-在这个例子中,我尝试将每个节点填充到连接到同一掩码两次或更长时间的新列表中..但这不是按预期工作。

4

1 回答 1

0

itertools.groupby()提供了一种收集物品的有效方式:

from itertools import groupby

my_list = [['node1', 'mask1'],
          ['node2', 'mask1'],
          ['node3', 'mask1'],
          ['node4', 'mask2'],
          ['node5', 'mask2'],
          ['node6', 'mask3']]

masks_to_keep = ('mask1', 'mask2')

# create a dict keyed by mask with (node, mask) pairs
as_dict = {x[0]: list(x[1]) for x in groupby(my_list, lambda x: x[1])}

# create a list, in masks_to_keep order, of lists of nodes per mask
nodes = [[x[0] for x in as_dict[mask]] for mask in masks_to_keep]
于 2017-01-02T03:57:21.327 回答