在不使用 endswith() 的情况下从列表中删除以后缀结尾的单词

Remove words from a list that end with a suffix without using endswith()

我想编写一个带有 2 个参数的 python 函数:

  1. 单词列表和
  2. 结尾字母

我希望我的函数以修改原始单词列表并删除以指定的“结尾字母”结尾的单词的方式工作。

例如:

list_words = ["hello", "jello","whatsup","right", "cello", "estello"]
ending = "ello"

my_func(list_words, ending)

这应该给出以下输出:

list_words = ["whatsup","right"]

它应该弹出所有以函数第二个参数中给出的结尾字母结尾的字符串。

我可以使用 .endswith 方法编写此函数,但不允许我使用它。我还能如何使用循环执行此操作?

尝试:

def my_func(list_words, ending):
    return [word for word in list_words if word[len(word)-len(ending):] != ending]

您可以使用 string[-4:].

轻松检查字符串的最后 4 个字符

所以你可以使用下面的代码

list_words = ["hello", "jello","whatsup","right", "cello", "estello"]
ending = "ello"

def my_func(wordsArray, endingStr):
    endLen = len(endingStr)
    output = []
    for x in wordsArray:
        if not x[-endLen:] == endingStr:
            output.append(x)
    return output

list_words = my_func(list_words, ending)

您可以像这样 list comprehension 缩短函数:

def short_func(wordsArray, endingStr):
    endLen = len(endingStr)
    output = [x for x in wordsArray if x[-endLen:] != endingStr]
    return output

list_words = short_func(list_words, ending)

最好不要修改现有列表,您可以获得一个没有指定结尾单词的列表,如下所示。如果你想把它作为一个函数,你可以通过以下方式拥有它。您可以再次将格式化列表分配给 list_words。

def format_list(words, ending):
    new_list = []
    n = len(ending)
    for word in words:
        if len(word) >= n and  n > 0:
            if not word[-n:] == ending:
                new_list.append(word)
        else:
            new_list.append(word)
    return new_list 

list_words = format_list(list_words, ending)
print(list_words)
def filter_words(list_words, ending):
    return [*filter(lambda x: x[-len(ending):] != ending , list_words)]

不允许使用endswith?没问题:-P

def my_func(list_words, ending):
    list_words[:] = [word for word in list_words
                     if not word[::-1].startswith(ending[::-1])]
    return list_words

漏洞。

(根据您坚持修改给定列表进行调整。您可能真的应该决定是修改还是修改 return,但是,不要两者都做,这在 Python 中是相当不寻常的。)