如何高效地在Python中删除单个字母的单词

3
我希望能够使用Python函数删除单个字母的单词,例如ai ee gb f fy o l oc y l等。目前我的代码如下:
def remove_single_letters(concept):
    mystring = "valid"

    if len(concept) == 1:
        mystring = "invalid"

    if len(concept)>1:
        validation = []
        splits = concept.split()
        for item in splits:
            if len(item) > 1:
                validation.append("valid")
        if len(validation) != 1:
            mystring = "invalid"
    return mystring

print(remove_single_letters("b f f"))

这很好。但是,我想知道是否有一种更有效率(用更少的时间)的Python方法来完成它。


1
如果您的程序运行良好,您也可以在[codereview.se]上发布它。 - user202729
2个回答

6

这里有一个单行解决方案:

def remove_single_letters(concept):
    return ["valid", "invalid"][concept.count(" ") >= len(concept) // 2]

更新:请注意,这种方法更短更酷,但不一定运行更快。
说明:
- `concept.count(" ")`:返回字符串中空格的数量。 - `>= len(concept) // 2`:如果超过一半的字符串是空格,则返回True(当存在多个合法单词之间的空格时会失败,如@user202729所述)。 - `["valid", "invalid"][result]`:这部分只是为了好玩:如果 `result` 是 `False`,则返回第一个元素;如果 `result` 是 `True`,则返回第二个元素(因为 `False` 等于 `0`,而 `True` 等于 `1`)。

1
@Selcuk 你好,你能解释一下那行代码吗? - Narendra Lucky
2
使用布尔值索引一个包含两个元素的列表看起来很酷,但在实际代码中最好使用条件语句代替... - user202729
使用 ("valid", "invalid") 可能更好,但我想将其作为列表也可以。 - iz_
3
如果有多个连续的空格,那么这种方法会失败。 - user202729
这也是为什么我认为这样做可能更好的原因。如果字节码和源代码说的不一样,那就不是很理想了。 - iz_

1
如果您想检查字符串中是否存在任何一个单字母字符,我建议选择更简洁的解决方案(虽然两种解决方案的时间复杂度均为O(n))。
remove_single_letters = lambda concept:"invalid" if 1 in [len(item) for item in concept.split()] else "valid"
print(remove_single_letters("a b c"))
#prints invalid

一个普通的函数会像这样:

def remove_single_letters(concept):
    return "invalid" if 1 in [len(item) for item in concept.split()] else "valid"

他们都检查拆分输入中元素的长度,以找到任何长度为1且由于split()对多个空格不敏感的项。
如果您想检查完全由单个字符组成的字符串:
def remove_single_letters(concept):
    u = set(len(item) for item in concept.split()) 
    return "invalid" if len(u) == 1 and 1 in u else "valid"

1
我猜要求是不能有连续的字母。这个解决方案会将 h ello 标记为无效。 - Selcuk
1
谢谢@Selcuk。我包含了能够重现问题原始行为的解决方案。我曾经误解了问题并提出了一种检查字符串中是否存在任何单个字母的方法。 - Farzad Vertigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接