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