Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于每个数组的第一个元素从嵌套数组中删除数组_Python_List - Fatal编程技术网

Python 基于每个数组的第一个元素从嵌套数组中删除数组

Python 基于每个数组的第一个元素从嵌套数组中删除数组,python,list,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中有这样做的方法吗?您可以这样做 >>> a=[[1,2,3],[2,4,7],[4,2,8],[3,5,7]

我有两个嵌套数组

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中有这样做的方法吗?

您可以这样做

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


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

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

  • 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))
    

  • 您可以使用嵌套列表分配
    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]]
    

    使用
    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 = [[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 = [[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)的同时删除重复值,即,
      集合中的0([0,1,2])为O(1)
      成员签入列表可能会变为O(n)的最坏情况
    • 最后,通过迭代list2并检查第一个元素是否不在集合中来创建一个列表

    使用字典来增强数据结构并保证线性复杂性,假设所有l[0]都不同:

    source,target={l[0]:l for l in a},{l[0]:l for l in b}
    [target[key] for key in target.keys()-source.keys()]  
    

    您可以使用
    any
    来减少运行时间。您能解释一下上面的代码是如何工作的吗?这意味着对于第一次运行的循环或对于列表b上的每个迭代,我们为a中的j创建
    [j[0]
    列表?@VivekSable:是的,为
    b中的每个元素重新构建了a中的j的列表理解
    [j[0]
    ,因此这种方法效率很低。可以通过将a]
    中j的列表comp更改为
    [f(j[0])来证明这一点,其中
    f
    是一个打印并返回其参数的函数。Avinash第二版没有这个缺陷,但如果
    k
    set
    frozenset
    ,那就更好了。谢谢您的解释,是的,第二种方法会更好。Set将更好地提高性能。向上投票+1WIW,创建
    k
    的较短方法是
    zip(*a)[0]
    。结果是一个元组,但这在这里并不重要。不过,我不知道它是否比列表中的comp快。@Avinish Raj在下面的一拳中击败了我:)可爱,尽管这种技术不能保证保持秩序。但这可能不是问题。当然,这不会在Python2上运行(因为在Python2中,
    dict.keys()
    返回一个列表),但这也可能不是问题在Python 2.7中,减法不起作用,`[1,2]-[1]回溯(最近一次调用):文件“”,第1行,在TypeError中-:“list”和“list”
    的操作数类型不受支持。这是在
    Python3.x中运行的`这是非常快速和高效的。谢谢大家!@胡舒很乐意帮忙