让我们来看看…
return [x for x in document.split()
if 'a' in x and sum((1 if y in 'abcdef' else 0 for y in x)) >= 3]
没有参数的split作为“单词”函数,在任何空格上拆分并删除不包含字符的单词.然后检查字母’a’是否在单词中.如果单词中有’a’,则使用生成器表达式,该表达式遍历单词中的每个字母.如果字母在可用字母串内,则返回1,该值对总和有贡献.否则,它返回0.然后如果总和是3或更大,它保持它.使用生成器而不是列表推导,因为sum将接受任何可迭代的内容,并且它会阻止必须创建临时列表(更少的内存开销).
它没有最佳的访问时间,因为使用in(在字符串上应该有一个O(n)时间),但这通常不是一个非常大的问题,除非数据集很大.你可以优化一点来将字符串打包成一个集合,常量’abcdef’可以很容易地成为一个集合.我只是不想破坏漂亮的一个班轮.
编辑:哦,为了改善if部分的时间(这是低效率的地方),你可以把它分成一个迭代字符串一次的函数,如果满足条件则返回True.我会这样做,但它毁了我的一个班轮.
编辑2:我没有看到“必须有3个不同的角色”部分.你不能在一个班轮里做到这一点.你可以把if部分带到一个函数中.
def is_valid(word, chars):
count = 0
for x in word:
if x in chars:
count += 1
chars.remove(x)
return count >= 3 and 'a' not in chars
def parse_document(document):
return [x for x in document.split() if is_valid(x, set('abcdef'))]
这个不应该对现实世界的数据集有任何性能问题.