2015-10-19 89 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)]