确定子列表的一部分是否在主lis中

2024-10-03 13:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有2d列表mainlist

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

我在想这样的事情(来自here的代码)

for sublist in mainlist:
    if all(i in sublist for i in slist1):
        return True
        break

有没有更“Python”的方法?谢谢

编辑:

  1. 根据mainlist测试的slist1将返回True
  2. slist2将返回False
  3. slist3将返回False
  4. slist4将返回False

所以基本上,我只是测试slist是否在mainlist[x]的前2个索引中


Tags: infalsetrue列表forjohnsmithmary
3条回答

既然OP没有回应,我将报道这两个案例。你知道吗

如果顺序不重要,则['John', 'Doe']['Doe', 'John']都假定包含在mainlist中:

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

如果顺序确实重要;['John', 'Doe']包含但['Doe', 'John']不在mainlist

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中每个列表中的子列表是否有slist1slist2。在这种情况下,您可以执行以下简单操作:

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

或者用^{}的较短解:

def sublist_intersection(lst, sub):
    sub_len = len(sub)
    return any(l[i:i+sub_len] == sub for l in lst for i in range(0, len(l), sub_len))

其工作原理如下:

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

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

如果我理解了你的问题,我想你可以用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:这个解决方案有很多缺点。。。而且也不包括所有的案子。你知道吗

相关问题 更多 >