根据每个数组的第一个元素从嵌套数组中删除数组

时间:2016-01-18 06:37:40

标签: python list

我有两个嵌套数组说

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中执行此操作?

5 个答案:

答案 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]]

备注:

  • 首先,我们创建一个集合来存储list1
  • 的所有唯一第一个值
  • 该集合用于删除重复值,同时成员检查集合几乎为O(1)ie)set([0,1,2]) is O(1)中的成员检查列表中的最坏情况可能是O(n)< / LI>
  • 最后通过遍历list2并检查set
  • 中是否存在第一个元素来创建列表

答案 2 :(得分:4)

这听起来像是一个家庭作业问题,但我会相信这不是一个问题。

您可以通过两个步骤轻松完成此操作:

  1. a中的所有第一个元素存储在一个集合中。
  2. 在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]]