Python:比较2个不同大小的元组列表

时间:2015-10-19 16:26:42

标签: python list tuples

我有2个元组列表。第一个列表包含带有2元组的x个条目,而另一个列表包含带有3个元组的y(更多)条目。

我想比较两个列表,但只比较元组的第一个和第二个元素,基本上只是删除了dublicates,但是在比较期间不应该考虑第二个列表中每个元组的第三个条目。

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 个答案:

答案 0 :(得分: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)]

答案 1 :(得分: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])

答案 2 :(得分: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)]