2017-01-02 44 views
-1

我們有一個2維列表如何在二維列表中互相測試項目?

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

(在這個例子中,我們有它獨特的6個節點和3個口罩人口)現在我需要以某種試探對方,併產生一個新的列表,把各節點連接到單獨的[]中的掩碼,所以我可以稍後輕鬆訪問它,而且還需要過濾像「node6」這樣的節點,因爲「node6」僅連接到一個掩碼(在我們的例子中僅用「掩碼3」)

基本上我想我的新名單,看起來像這樣:

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') - 但事情是我需要檢查這個以編程方式=超過onc節點連接到每個掩碼,在我們的例子中是掩碼1和掩碼2真..儘管如何oyu將其包括在代碼中? – masky007

+0

真的嗎?itertools是2.3版本以後的python stdlib的一部分,使用它,因爲它非常棒,而且你沒有給我更多關於'node'或'mask'的信息,所以我使用了字符串。只要這些項目是不可變的,它就會工作,所以把你想要保留的掩碼放入一個列表或元組中,並且你應該很好走。 –