我有两个列表
A=[['1','1'],['2','1'],['3','2']]
B=[['1','1'],['2','2']]
我想对这些只比较第一个元素执行A-B操作。
所以A-B应该给出
Output=[['3', '2']]
到目前为止,我只能进行行比较
[x for x in A if not x in B]
,输出为[['2', '1'], ['3', '2']]
答案 0 :(得分:1)
此?
>>> [i for i in A if not any(i[0] == k for k, _ in B)]
[['3', '2']]
any()
用于检查每个列表的第一个元素是否与B
中每个列表中的任何其他值相同。如果是,则返回True,但正如我们想要的那样,我们使用not any(...)
答案 1 :(得分: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)))
如果顺序无关紧要,那么正常的字典就足够了。
答案 2 :(得分: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]]