我知道这个问题已有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版本(据我所知, 还有 其他所有提供的解决方案) ,
甚至支持重叠模式。所以你去了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)