列表中的优雅查找子列表

列表中的优雅查找子列表,第1张

列表中的优雅查找子列表

我知道这个问题已有5个月了,并且已经“被接受”,但是在谷歌上搜索了一个非常类似的问题,使我想到了这个问题,所有答案似乎都存在两个相当重要的问题,而且我很无聊并且想尝试一下在一个SO答案上,所以我将对发现的结果感到不满意。

就我所知,问题的第一部分非常琐碎:仅返回原始列表,其中所有未过滤掉“模式”中的元素。按照这种想法,我想到的第一个代码使用了filter()函数:

def subfinder(mylist, pattern):    return list(filter(lambda x: x in pattern, mylist))

我要说的是,该解决方案绝对比原始解决方案简洁,但是它没有任何更快,或者至少没有那么明显,如果没有很好的理由,我会尽量避免使用lambda表达式。实际上,我能想到的最佳解决方案包括一个简单的列表理解:

def subfinder(mylist, pattern):    pattern = set(pattern)    return [x for x in mylist if x in pattern]

该解决方案不仅比原始解决方案更优雅,而且速度也大大提高:理解速度比原始解决方案快约120%,同时将图案投射到一组最初的凹凸中,在我的测试中,速度提高了多达320%。

现在获得奖金:我将直接进入其中,我的解决方案如下:

def subfinder(mylist, pattern):    matches = []    for i in range(len(mylist)):        if mylist[i] == pattern[0] and mylist[i:i+len(pattern)] == pattern: matches.append(pattern)    return matches

这是史蒂文·鲁姆巴尔斯基(Steven Rumbalski)“低效的班轮”的一种变体,它增加了“ mylist [i] == pattern
[0]”检查功能,并且由于python的短路评估,因此比原始语句都快得多和itertools版本(据我所知, 还有 其他所有提供的解决方案)
甚至支持重叠模式。所以你去了。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5617999.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存