Как проверить предметы друг с другом в двухмерном списке?

У нас есть двумерный список (для этого примера он заполнен уникальными 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]
Другие вопросы по тегам