Как проверить предметы друг с другом в двухмерном списке?
У нас есть двумерный список (для этого примера он заполнен уникальными 6 узлами и 3 масками)
myList = [[node1, mask1],
[node2, mask1],
[node3, mask1],
[node4, mask2],
[node5, mask2],
[node6, mask3]]
Теперь мне нужно как-то протестировать друг друга и сгенерировать новый список, чтобы поместить каждый узел, подключенный к маске, в отдельный [], чтобы я мог легко получить к нему доступ позже, но также мне нужно отфильтровать узлы, такие как "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
Я знаю, что эта доза не имеет большого смысла для того, что я просил.. мои предыдущие попытки не сохраняются - в этом примере я пытался заполнить каждый узел в новом списке, который подключен к одной и той же маске дважды или более времени... но это не так работает как положено.
1 ответ
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]