2014-05-22 33 views
0

我有兩個數據集由嵌套列表組成,這些列表中的每個項目看起來像list1[i]= [a, x, y b]list2[j] = [c, x, y, d],並且兩個列表的長度不一定匹配。我希望能夠通過列表,保留它們的順序,並消除任何不包含匹配值x的子列表。最後,我想得到兩個相同長度的列表,並且對於每個索引,x值在相應的子列表中是相同的。刪除數據集中不匹配的項目

現在我有一個假定,list2設定x值的是那些在list1一個子集(真此刻),然後進行刪除,其中x值不匹配的項目有點亂碼。

len_diff = len(list1) - len(list2) 
    if len_diff > 0: 
     removed = [] 
     for (counter, row) in enumerate(list2): 
      while list1[counter][1] != list2[counter][1]: 
       removed.append(list1.pop(counter)) 
     new_len_diff = len(list1) - len(list2) 
     if new_len_diff < 0: 
      raise IndexError('Data sets do not completely overlap') 
     else: 
      for i in range(new_len_diff): 
       removed.append(temp_data.pop()) 

所以基本上我刪除,直到他們重新開始匹配,然後在list2去除list1末超越x值(拋出一個異常,如果我剪太不x值相匹配的項目大部分出自list1)。

有沒有更好的方法來做到這一點?

我不一定需要放寬當前list2中的所有x值都在list1這一假設,但它會使此代碼在將來對其他數據操作更有用。現在我的代碼中最大的漏洞是,如果我的list1數據存在差距,我將刪除我的整個列表。

+0

這看起來像做什麼被通緝在這種情況下,您可能希望查看將列表轉換爲集合並使用set_diff = set_one.difference(set_two)。 – Tylerflick

+0

@Tylerflick如果OP要保留訂單,請不要使用 – jonrsharpe

+0

對於您上面列出的列表@ user47487,您的期望結果如何? – cdhagmann

回答

1

你應該試試這個:

list1 = list2 = [x for x in list1 if x[1] in zip(*list2)[1]] 

編輯

基於下面的評論中,OP適應這個答案做

list1 = [x for x in list1 if x[1] in zip(*list2)[1]] 
list2 = [x for x in list2 if x[1] in zip(*list1)[1]] 
+0

這不適用於我正在使用的列表的結構。 '因爲list1和list2中的每一項都是一個子列表本身,我只想匹配每個子列表中的特定值,所以'master_list = [x for list1中的x代表列表2中的x]'返回'[]'。在我上面的例子中,'a!= b'和'c!= d' – JeffP

+0

類似的作品。你不能設置兩個列表相等(因爲這不是我想要的)。這實現了我想要的: 'list1 = [x for x in list1 if x [1] in zip(* list2)[1]];如果x [1]在zip(* list1)[1]]中,list2 = [x for x in list2]' – JeffP

+0

@ user47487,我很高興您找到了一個可行的解決方案! – cdhagmann