我有两个嵌套数组说
a=[[1,2,3],[2,4,7],[4,2,8],[3,5,7],[6,1,2]]
b=[[1,6,7],[2,4,9],[4,3,5],[3,10,2],[5,3,2],[7,2,1]]
我只希望将这些数组保留在b
中,其第一个元素与a
中数组的第一个元素不相同,所以我们应该得到这两个
c=[[5,3,2],[7,2,1]]
有没有办法在python中执行此操作?
答案 0 :(得分:8)
你可以这样做,
>>> a=[[1,2,3],[2,4,7],[4,2,8],[3,5,7],[6,1,2]]
>>> b=[[1,6,7],[2,4,9],[4,3,5],[3,10,2],[5,3,2],[7,2,1]]
>>> [i for i in b if i[0] not in [j[0] for j in a]]
[[5, 3, 2], [7, 2, 1]]
>>>
或
>>> k = [j[0] for j in a]
>>> [i for i in b if i[0] not in k]
[[5, 3, 2], [7, 2, 1]]
答案 1 :(得分:5)
使用set
<强>代码:强>
list1 = [[1,2,3], [2,4,7], [4,2,8], [3,5,7], [6,1,2]]
list2 = [[1,6,7], [2,4,9], [4,3,5], [3,10,2], [5,3,2], [7,2,1]]
check_set=set(val[0] for val in list1 )
print [val for val in list2 if val[0] not in check_set]
<强>输出:强>
[[5, 3, 2], [7, 2, 1]]
备注:强>
set([0,1,2]) is O(1)
中的成员检查列表中的最坏情况可能是O(n)< / LI>
答案 2 :(得分:4)
这听起来像是一个家庭作业问题,但我会相信这不是一个问题。
您可以通过两个步骤轻松完成此操作:
a
中的所有第一个元素存储在一个集合中。在b中过滤我们的列表,其中第一个元素在集合中不存在。
def remove_common(a, b):
"""remove lists from b whose first element is the first element of a list in a"""
first_elements = set(sublist[0] for sublist in a)
return list(filter(lambda sublist: sublist[0] not in first_elements, b))
答案 3 :(得分:2)
使用字典来增强数据结构并保证线性复杂性,假设所有l [0]都是不同的:
forkmode=once
答案 4 :(得分:1)
您可以为c
分配嵌套列表解析。
c = [each_b for each_b in b if each_b[0] not in [each_a[0] for each_a in a]]
print(c)
>>> [[5, 3, 2], [7, 2, 1]]