Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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,我有2d列表 mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]] slist1 = ['John', 'Doe'] slist2 = ['John', 'Smith'] slist3 = ['Doe', 'John'] slist4 = ['John', True] 如何确定子列表的子列表是否存在于一个列表中,其中,如果根据mainlist测试slist1,则返回True,而slist2将

我有2d列表

mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
slist1 = ['John', 'Doe']
slist2 = ['John', 'Smith']
slist3 = ['Doe', 'John']
slist4 = ['John', True]

如何确定子列表的子列表是否存在于一个列表中,其中,如果根据mainlist测试slist1,则返回True,而slist2将返回False

我在想这样的事情(源代码)

有没有更“蟒蛇式”的方法?谢谢

编辑:

  • 根据mainlist测试的slist1将返回True
  • slist2将返回False
  • slist3将返回False
  • slist4将返回False

  • 因此,基本上,我只是测试slist是否位于mainlist[x]的前2个索引中。

    如果我理解了您的问题,我想您可以使用
    set()
    和集合之间的交集,如以下示例:

    def list_intersection(a, b):
       for sub in a:
           condition = set(sub) & set(b)
           condition2 = len(set(b)) == len(condition)
           if condition and condition2:
               return True
       return False
    
    
    mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    slist1 = ['John', 'Doe']
    slist2 = ['John', 'Smith']
    
    list_intersection(mainlist, slist1)
    # True
    list_intersection(mainlist, slist2)
    # False
    

    PS:这个解决方案有很多缺点。。。它并没有涵盖所有的案例。

    由于OP没有回应,我将涵盖这两个案例

    如果顺序不重要;
    ['John','Doe']
    ['Doe','John']
    都假定包含在
    主列表中:

    def list_intersection_no_order(a, b):
        b = set(b)
        if any(b.difference(sublist) == set() for sublist in a):
            return True
        return False
    
    
    mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    slist1 = ['John', 'Doe']
    slist2 = ['John', 'Smith']
    slist3 = ['Doe', 'John']
    
    print(list_intersection_no_order(mainlist, slist1))
    # True
    print(list_intersection_no_order(mainlist, slist2))
    # False
    print(list_intersection_no_order(mainlist, slist3))
    # True
    
    def list_intersection_with_order(a, b):
        if any(b == sublist[:2] for sublist in a):
            return True
        return False
    
    
    mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    slist1 = ['John', 'Doe']
    slist2 = ['John', 'Smith']
    slist3 = ['Doe', 'John']
    
    print(list_intersection_with_order(mainlist, slist1))
    # True
    print(list_intersection_with_order(mainlist, slist2))
    # False
    print(list_intersection_with_order(mainlist, slist3))
    # False
    

    如果秩序确实重要<代码>['John','Doe']
    已包含,但
    ['Doe','John']
    不在
    主列表中

    def list_intersection_no_order(a, b):
        b = set(b)
        if any(b.difference(sublist) == set() for sublist in a):
            return True
        return False
    
    
    mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    slist1 = ['John', 'Doe']
    slist2 = ['John', 'Smith']
    slist3 = ['Doe', 'John']
    
    print(list_intersection_no_order(mainlist, slist1))
    # True
    print(list_intersection_no_order(mainlist, slist2))
    # False
    print(list_intersection_no_order(mainlist, slist3))
    # True
    
    def list_intersection_with_order(a, b):
        if any(b == sublist[:2] for sublist in a):
            return True
        return False
    
    
    mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    slist1 = ['John', 'Doe']
    slist2 = ['John', 'Smith']
    slist3 = ['Doe', 'John']
    
    print(list_intersection_with_order(mainlist, slist1))
    # True
    print(list_intersection_with_order(mainlist, slist2))
    # False
    print(list_intersection_with_order(mainlist, slist3))
    # False
    

    似乎要检查
    mainlist
    中每个列表中的子列表是否有
    slist1
    slist2
    。在这种情况下,您可以执行以下简单操作:

    def sublist_intersection(lst, sub):
        sub_len = len(sub)
    
        for l in lst:
            for i in range(0, len(l), sub_len):
                if l[i:i+sub_len] == sub:
                    return True
    
        return False
    
    或一个较短的解决方案,包括:

    其工作原理如下:

    >>> mainlist = [['John','Doe',True],['Mary','Jane',False],['James','Smith',False]]
    >>> slist1 = ['John', 'Doe']
    >>> slist2 = ['John', 'Smith']
    >>> slist3 = ['Doe', 'John']
    >>> sublist_intersection(mainlist, slist1)
    True
    >>> sublist_intersection(mainlist, slist2)
    False
    >>> sublist_intersection(mainlist, slist3)
    False
    

    注意:这还假设您正在检查相邻的子列表,其中顺序很重要

    您想测试mainlist列表中的所有项目还是只测试前两个项目?在这种情况下,我会做
    if slist1==sublist[:2]:
    而不是
    all
    “如何确定子列表的子列表是否存在于一个列表中,其中如果slist1根据mainlist进行测试,则返回True,而slist2将返回False”这让我头疼。你能更清楚地定义你想要什么吗?让所有
    设置
    sDo成为mainlist中每个子列表的索引2中的布尔值怎么样?