Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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,我有以下列表,我正在删除所有不包含sl[0]或sl[1]子列表的列表: l = [ ['s1', 's5', 's6', 's8', 's10', 's5', 's15', 's23'], ['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'], ['s1', 's5', 's6', 's10', 's14', 's15', 's23'] ] sl = [['s5','s6','s8'],['s15', 's23']] 此代码为

我有以下列表,我正在删除所有不包含
sl[0]
sl[1]
子列表的列表:

l = [
 ['s1', 's5', 's6', 's8', 's10', 's5', 's15', 's23'],
 ['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'],
 ['s1', 's5', 's6', 's10', 's14', 's15', 's23']
]
sl = [['s5','s6','s8'],['s15', 's23']]
此代码为两个子列表的硬编码
sl[0]
sl[1]

list(filter(lambda l : not(set(sl[0]+sl[1])-set(l)), l))
['s5','s6','s8'] + ['s15', 's23']
becomes
['s5','s6','s8', 's15', 's23']
{'s5','s6','s8', 's15', 's23'}

如何使此代码更灵活?如果
sl
包含5个或10个或任何其他数量的子列表,该怎么办?

您可以使用
more itertools
软件包来实现这一点。您需要在
l
的每个元素中检查
len(sl[i])
的每个子序列。这将是缓慢的,但可行的

我还创建了一个工厂函数,它使用
partial
,这样您就可以随便打开
sl
了。这与您对
过滤器的使用保持一致

从更多工具导入窗口
从functools导入部分
def命令检查(x,sub):
s=元组(子)
对于窗口中的y(x,len(sub)):
如果s==y:
返回真值
返回错误
def订购检查全部(x,接头):
返回所有(针对sub中的sub,按顺序检查(x,sub))
def检查工厂(SUB):
返回部分(有序检查全部,SUB=SUB)
列表(过滤器(检查工厂(sl),l))
#返回
[s1',s5',s6',s8',s10',s5',s15',s23'],
[‘s1’、‘s5’、‘s8’、‘s10’、‘s5’、‘s6’、‘s8’、‘s15’、‘s23’],
[‘s1’、‘s5’、‘s6’、‘s10’、‘s14’、‘s15’、‘s23’]]

我很难读懂你的代码:

list(filter(lambda l : not(set(sl[0]+sl[1])-set(l)), l))
首先将
s1[0]
sl[1]
连接起来:

list(filter(lambda l : not(set(sl[0]+sl[1])-set(l)), l))
['s5','s6','s8'] + ['s15', 's23']
becomes
['s5','s6','s8', 's15', 's23']
{'s5','s6','s8', 's15', 's23'}
然后从
sl[0]+sl[1]
set(sl[0]+sl[1])
中创建一个集合:

然后从结果中减去
set(l)
。这甚至行不通,因为
l
是一个列表列表。字符串列表可以转换为一个集合,因为集合的元素可以是字符串。但是,列表不能是集合的元素



要从
l
中删除不包含
sl
中包含的任何有序序列的列表,或者不包含
sl
中任何一个列表中的所有元素?@James:我想从
l
中删除不包含
sl
中包含的有序序列的列表。你说的灵活是什么意思?詹姆斯的问题很重要,因为你的答案会影响你所使用的算法的复杂性need@VictorDeleau:灵活性是指非硬编码方法。目前我指定了
sl[0]+sl[1]
,但是如果
sl
包含数百个列表怎么办?谢谢,但是你的答案是什么?为什么返回
['s1','s5','s6','s10','s14','s15','s23']
?它不包含子列表
['s5','s6','s8']
。为了满足我的要求,我用
all(ordered_-check(x,sub)代替了
any(ordered_-check(x,sub)代替sub-in-subs)
。你能更新你的答案,让我接受吗?谢谢。它是返回的,因为它包含序列
['s15','s23']
。我可能误解了这个问题。是否需要所有子序列都存在?如果是这样的话,
all
确实是正确的方法。我已经更新了相应的快速澄清:你知道如何过滤不包含任何子列表的列表吗?我尝试使用
列表(过滤器(~check_factory(sl),l))
。如果有一个快速的解决方案,我将感谢你的提示。否则,我将打开一个新线程。谢谢。你可以用lambda函数来包装它<代码>列表(过滤器(lambda x:不检查工厂(sl)(x),l))