2017-01-02 3 views
-1

У нас есть 2 одномерный список (в данном примере мы его заполненным уникальный 6 узлов и 3 маски)Как проверить элементы друг с другом в 2-мерном списке?

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

Вы не показать, что вы пробовали. –

+0

@StephenRauch я отредактировал мое сообщение сейчас – masky007

ответ

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] 
+0

Спасибо за ответ, хотя как бы вы это сделали без itertools (я делаю этот код для nuke, я бы предпочел бы его без itertools для стартеров .. – masky007

+0

Вы включили masks_to_keep = ('mask1 ',' mask2 ') - но мне нужно проверить это программно = каждая маска, к которой подключен более узкий узел, в нашем примере - mask1 и mask2 true .. хотя как бы включить его в код? – masky007

+0

На самом деле? Itertools является частью python stdlib с 2.3. Используйте его, потому что это замечательно. Кроме того, вы больше не указали мне, что такое «узел» или «маска». Поэтому я использовал строки. замечательный язык, который он есть, не волнует, пока эти элементы неизменяемы. Это просто сработает. Поэтому поставьте маски, которые вы хотите сохранить в списке или кортеже, и вам должно быть хорошо идти. –

Смежные вопросы