2015-10-19 86 views
4

我有2個元組列表。第一個列表包含具有2元組的x條目,而另一個列表包含具有3元組的y(更多)條目。Python:比較不同大小的元組列表

我想比較兩個列表,但只是元組的第1和第2個元素,基本上只是刪除dublicates,但在比較過程中不應考慮第2個列表中每個元組的第3個條目。

list_x=[(1,1),(1,2),(2,3),(2,5),(4,6), ...] 
list_y=[(1,1,33),(1,3,65),(2,4,11), ...] 

現在我想創建一個新的列表,其中list_y中也出現在list_x中的所有元素都被刪除。 結果列表應該是這樣的:

[(1,3,65),(2,4,11), ...] 

對於它由只是轉換列表中的一組作品簡單地相同大小的元組的列表,並減去兩個列表:

newlist = list(set(list_y) - set(list_x)) 

它也是可以通過元組的第二個元素生成的列表進行排序:

newlist.sort(key=lambda tup: tup[1]) 

但現在的問題是:怎麼可能這樣做,如果列表看起來像 以上?

回答

3

可以轉換list_x一組,然後遍歷list_y和檢查的list_y前兩個元素都出現在集與否,如果不存在包括他們在結果列表中,這可以在列表理解中完成,如下所示。實施例 -

list_x=[(1,1),(1,2),(2,3),(2,5),(4,6), ...] 
list_y=[(1,1,33),(1,3,65),(2,4,11), ...] 

list_x_set = set(list_x) 

result = [item for item in list_y if item[0:2] not in list_x_set] 

演示 -

In [57]: list_x=[(1,1),(1,2),(2,3),(2,5),(4,6)] 

In [58]: list_y=[(1,1,33),(1,3,65),(2,4,11)] 

In [59]: list_x_set = set(list_x) 

In [60]: result = [item for item in list_y if item[0:2] not in list_x_set] 

In [62]: result 
Out[62]: [(1, 3, 65), (2, 4, 11)] 
0

試試下面的代碼:

set_x = set(list_x) 
answer = sorted([t for t in list_y if (t[0], t[1]) not in set_x], key=lambda t:t[1]) 
0
with for loops 

list_x=[(1,1),(1,2),(2,3),(2,5),(4,6)] 
list_y=[(1,1,33),(1,3,65),(2,4,11)] 

for elx in list_x: 
    for ely in list_y: 
     if ely[:-1] == elx: 
      list_y.remove(ely) 


print(list_y) 

[(1, 3, 65), (2, 4, 11)]