Созданная функция не входит в цикл - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь проверить, начинается ли слово из списка буквой из отдельного списка, и создать список с этими словами. В моих созданных функциях похоже, что он не вводит while l oop, так как он всегда возвращает пустой список.

def starts_with(word, chs):
    if word == "":
        return False
    elif chs == []:
        return False
    i = 0
    while i < len(chs):
        x = chs[i]
        if word[0] == x:
            return True
        i+=1
    else:
        return False

def search(words, start_chs):
    i = 0
    ret = []
    while i > len(words):
        x = words[i]
        if starts_with(x, start_chs):
            ret.append(x)
        i += 1  
    if not words:
        return ("not words")

    elif not start_chs:
        return ("not start_chs")
    else:
        return ret

a = ['green', 'grasses', 'frolicking', 'cats', '', 'kittens', 'playful']
b = ['a', 'c', 'g']
new_words = search(a, b)
print(new_words)

Ответы [ 3 ]

0 голосов
/ 18 апреля 2020

Вы написали неправильный оператор здесь

 while i > len(words):

Так как, i = 0 и len (слова)> 0, он никогда не входит в l oop. Измените его на

 while i < len(words):
0 голосов
/ 18 апреля 2020

Я рекомендую вам использовать startswith:

a = ['green', 'grasses', 'frolicking', 'cats', '', 'kittens', 'playful']
b = ['a', 'c', 'g']
new_words = []
for word in a:
    new_words.extend([word for c in b if word.startswith(c)]) 
print(new_words)
# ['green', 'grasses', 'cats']

Причина, по которой ваша функция всегда возвращает пустое значение, состоит в том, что вы установили i > len(words). В начале i = 0, поэтому всегда меньше или равно words

0 голосов
/ 18 апреля 2020

Попробуйте заменить:

while i > len(words):

На:

while i < len(words):

Вы хотите, чтобы индекс i был на меньше , чем количество элементов в words.

После этого я получаю:

>>> search(a, b)
['green', 'grasses', 'cats']

Кстати, вы можете сделать это более Pythoni c способом, используя что-то вроде:

new_words = [item for item in a if item.startswith(tuple(b))]
...