gpt4 book ai didi

python - 基于子列表过滤列表时如何避免硬编码?

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:29 27 4
gpt4 key购买 nike

我有以下列表列表,我正在删除所有不包含 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']]

此代码针对 2 个子列表 sl[0]sl[1] 进行了硬编码:

list(filter(lambda l : not(set(sl[0]+sl[1])-set(l)), l))

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

最佳答案

您可以使用 more-itertools 包来完成此操作。您需要在 l 的每个元素中检查 len(sl[i]) 的每个子序列。它会很慢,但可行。

我还创建了一个使用 partial 的工厂函数,这样您就可以弹出任何 sl 恰好是什么。这与您对 filter 的使用保持一致。

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 all(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))
# returns
[['s1', 's5', 's6', 's8', 's10', 's5', 's15', 's23'],
['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'],
['s1', 's5', 's6', 's10', 's14', 's15', 's23']]

关于python - 基于子列表过滤列表时如何避免硬编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58783451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com