Python 确定子列表的一部分是否在主列表中
我有2d列表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将
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 我在想这样的事情(源代码) 有没有更“蟒蛇式”的方法?谢谢 编辑:
因此,基本上,我只是测试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中的布尔值怎么样?