我们有一个二维列表(对于这个例子,我们填充了独特的6个节点和3个掩码)
myList = [[node1, mask1],
[node2, mask1],
[node3, mask1],
[node4, mask2],
[node5, mask2],
[node6, mask3]]
现在我需要以某种方式相互测试并生成一个新列表,将连接到掩码的每个节点放在一个单独的[]中,这样我以后可以轻松访问它,但我还需要过滤节点,如&# 34; node6"因为" node6"仅连接到一个掩码(在我们的例子中使用" mask3"仅限)
基本上我希望我的新列表看起来像这样:
newList = [[node1, node2, node3], [node3, node4]]
这让我头疼了好几个小时..谢谢你的提前!
注意:很高兴看到最有效的方法是什么
edit1:我尝试了什么:
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
我知道这个剂量对于我的问题没有多大意义..我以前的尝试都没有保存 - 在这个例子中,我试图将每个节点填充到连接到同一个掩码两次或更多次的新列表中..但是这没有按预期工作。
答案 0 :(得分: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]