0

我有两个清单

A=[['1','1'],['2','1'],['3','2']]

B=[['1','1'],['2','2']]

我想对这些仅比较第一个元素执行 AB 操作。

所以AB应该给

Output=[['3', '2']]

到目前为止,我只能做行比较

[x for x in A if not x in B]

输出为[['2', '1'], ['3', '2']]

4

3 回答 3

1

这个?

>>> [i for i in A if not any(i[0] == k for k, _ in B)]
[['3', '2']]

any()用于检查每个列表的第一个元素是否与 中的每个列表中的任何其他值相同B。如果是,则返回 True,但由于我们想要与此相反,我们使用not any(...)

于 2013-07-05T08:08:17.983 回答
0

我可以想到一个不同的列表理解

A=[['1','1'],['2','1'],['3','2']]
B=[['1','1'],['2','2']]
b = dict(B)
output_list = [item for item in A if item[0] not in b]

这也是顺序保留,即使 A 的内部列表中有重复的第一个元素也可以工作。如果需要,它也可以扩展以检查精确的对,如下所示:

A=[['1','1'],['2','1'],['3','2']]
B=[['1','1'],['2','2']]
b = dict(B)
output_list = [item for item in A if item[0] not in b or b[item[0]] != item[1]]
于 2013-07-05T09:01:19.880 回答
0

您还可以collections.OrderedDict 在此处使用和设置差异:

>>> from collections import OrderedDict
>>> dic1 = OrderedDict((k[0],k) for k in A)
>>> [dic1[x] for x in set(dic1) - set(y[0] for y in B)]
[['3', '2']]

总体复杂性将是O(max(len(A), len(B)))

如果顺序无关紧要,那么普通的字典就足够了。

于 2013-07-05T08:34:14.140 回答