Python 如何从其他列表中选择不包含有序序列的列表?
如何选择不包括sl中包含的所有有序序列的列表?这是一个代码:Python 如何从其他列表中选择不包含有序序列的列表?,python,list,Python,List,如何选择不包括sl中包含的所有有序序列的列表?这是一个代码: l = [ ['s1', 's5', 's6', 's8', 's10', 's5'], ['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'], ['s1', 's5', 's6', 's10', 's14'] ] sl = [['s5','s6','s8'],['s15', 's23']] from more_itertools import windowed
l = [
['s1', 's5', 's6', 's8', 's10', 's5'],
['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'],
['s1', 's5', 's6', 's10', 's14']
]
sl = [['s5','s6','s8'],['s15', 's23']]
from more_itertools import windowed
from functools import partial
def ordered_check(x, sub):
s = tuple(sub)
for y in windowed(x, len(sub)):
if s == y:
return True
return False
def ordered_check_all(x, subs):
return any(~ordered_check(x, sub) for sub in subs)
def check_factory(subs):
return partial(ordered_check_all, subs=subs)
list(filter(check_factory(sl), l))
预期的输出是此输出,因为它不包含sl的所有有序序列:
但是,如果我运行此代码,它将返回l的所有子列表。不确定为什么任何~ordered_检查都不起作用
更新:
我试着用答案中建议的不一样来代替~。但它不适用于以下示例:
l = [['p4', 'p5', 'p7', 'p9', 'p11', 'p13', 'p15', 'p13', 'p15', 'p23', 'p19', 'p21', 'p16', 'p17', 'p18', 'p16', 'p25'],
['p4', 'p5', 'p7', 'p9', 'p11', 'p13', 'p15', 'p13', 'p15', 'p23', 'p19', 'p21', 'p16', 'p25'],
['p4', 'p5', 'p7', 'p9', 'p11', 'p13', 'p15', 'p13', 'p15', 'p23', 'p20', 'p22', 'p20', 'p23', 'p19', 'p21', 'p16', 'p17', 'p18', 'p16', 'p25'],
['p4', 'p5', 'p7', 'p9', 'p11', 'p13', 'p15', 'p13', 'p15', 'p23', 'p20', 'p22', 'p20', 'p23', 'p19', 'p21', 'p16', 'p25']
]
sl =
[
['p15', 'p23', 'p15'],
['p13', 'p15', 'p13', 'p15', 'p14'],
['p14', 'p15', 'p14', 'p15', 'p13'],
['p13', 'p15', 'p23', 'p19'],
['p13', 'p15', 'p23', 'p20'],
['p14', 'p15', 'p23', 'p19'],
['p14', 'p15', 'p23', 'p20']
]
您应该替换:
any(~ordered_check
与
基本上,您可以使用下一种方法检查一个列表是否包含在另一个列表中,而无需中断顺序:
def contains_list(list_1, list_2):
n = len(list_1)
return any(list_1 == list_2[i:i + n] for i in range(len(list_2)-n + 1))
然后,您可以在此方法上传递sl变量的不同列表:
result = []
for check_list in sl:
if not any(contains_list(check_list, source_list) for source_list in l)
result.append(check_list)
print(result)
注意:很抱歉,我现在无法在手机上尝试该代码,因此可能它无法100%工作
希望有帮助。可能重复:谢谢。由于某种原因,它不起作用。请检查我的更新。
def contains_list(list_1, list_2):
n = len(list_1)
return any(list_1 == list_2[i:i + n] for i in range(len(list_2)-n + 1))
result = []
for check_list in sl:
if not any(contains_list(check_list, source_list) for source_list in l)
result.append(check_list)
print(result)