Как убедиться, что меньшая подстрока не найдена внутри большей подстроки (т.е. слово, содержащее «она», также не помечается как «он») - PullRequest
0 голосов
/ 03 мая 2019

Надеюсь, я правильно сформулировал свой вопрос.

По сути, вот что я пытаюсь сделать: используя список местоимений, я должен искать слова в отдельном списке, состоящем из двух из указанных местоимений (то есть «юность» будет найдена и распечатана после сопоставляя "твое" и "ты")

Что происходит не так: я точно нахожу слова, но проблема здесь в том, что пример в названии. Когда я запускаю программу, у меня будут результаты, которые соответствуют двум подстрокам друг в друге (т. Е. «Youn появляется, потому что видит« Ты »и« Твой »или« Наш »).

Я использую Python 3.x, и это один из разделов проблемы для домашнего задания, и это последний, который мне осталось сделать. Я пробовал довольно много решений, но ни одно из них не сработало. Один из них создавал массив копий, который вместо этого проверялся, и удалял каждый элемент по мере продвижения. Другой использовал пустой список, в который было добавлено первое совпадение, в котором затем сравнивалось бы следующее совпадение на случай, если следующее совпадение будет в первом совпадении. Но независимо от того, что я пытаюсь сделать, я постоянно получаю плохие совпадения, или ничего не печатается, потому что счетчик больше не увеличивается.

Список местоимений, с которыми мне нужно работать:

pronouns = ['thou', 'thee', 'thine', 'thy', 'i', 'me', 'mine', 'my', 'we',
            'us', 'ours', 'our', 'you', 'yours', 'your', 'he', 'him', 'his',
            'she', 'her', 'hers', 'it','its', 'they', 'them','theirs','their']

Пример списка слов:

wordList: = ['a', 'youthem', 'thyme', 'adathey', 'bathem', 'writmaker',
'writmaking', 'youngling', 'your', 'yourn', 'yours', 'youse', 'youthsome', 
'youthtide', 'youthy', 'zygomaticosphenoid', 'zymite', 'zymosimeter', 
'zymosthenic', 'zythem']

Мой код:

    for line in wordList:
        hasBoth = 0 #Counter where the program will not print a word
                    #if it does not equal 2.
        for pnoun in pronouns:
            #print(str(hasBoth) + " " + str(nounCopy)) #Test to check what's
                                               #triggering some of the words.
            if hasBoth == 2: #Breaks the loop if both words are found.
                break
            if pnoun not in line: #If there's no match, do nothing and
                                  #continue
                continue
            elif pnoun in line: #If match, add 1 to counter and continue
                hasBoth += 1
                continue
            else: #just in case
                break

        if hasBoth == 2:
            print(line + "\n") #Print the line that was a success
            hasBoth = 0 #reset the counter
            continue
        elif hasBoth != 2: #If no match, just reset the counter and move on
            hasBoth = 0 #reset the counter
            continue
        else:   #Another one for just in case something else happens
            print("Ya'll broke somthin")
            break

Ожидаемый результат должен быть:

youthey
thyme
youthy

Но фактический результат - весь список минус первый элемент.

1 Ответ

0 голосов
/ 03 мая 2019
pronouns = ['thou', 'thee', 'thine', 'thy', 'i', 'me', 'mine', 'my', 'we',
            'us', 'ours', 'our', 'you', 'yours', 'your', 'he', 'him', 'his',
            'she', 'her', 'hers', 'it','its', 'they', 'them','theirs','their']

wordList = ['a', 'youthem', 'thyme', 'adathey', 'bathem', 'writmaker',
'writmaking', 'youngling', 'your', 'yourn', 'yours', 'youse', 'youthsome', 
'youthtide', 'youthy', 'zygomaticosphenoid', 'zymite', 'zymosimeter', 
'zymosthenic', 'zythem']


return_list = []

for pronoun in pronouns:
    for word in wordList:
        replaced = word.replace(pronoun, '')
        boolean = replaced in pronouns and pronoun in word and word not in return_list
        return_list.append(word) if boolean else None

это решение с моей головы.Я, честно говоря, сделал бы это намного чище, но для удобства чтения это подойдет.Я предполагаю, что слово должно исключительно быть составлено из 2 местоимений (то есть youthey не может быть классифицировано как имеющее 3 местоимения you, they, the).Имея это в виду:

  1. проходит через каждое местоимение
  2. удаляет все следы местоимения в текущем цикле
  3. , если новое слово (replaced) все ещев списке pronouns это означает, что он состоит исключительно из 2 местоимений
  4. Вы также должны быть осторожны со словами, которые сами по себе являются местоимениями (your, например), отсюда и необходимость pronoun in word логическое
  5. Наконец, во избежание дублирования, проверьте, находится ли word в return_list.Технически вы можете просто завершить логику до # 5, а затем просто сгладить return_list, но это дополнительный шаг, которого вы могли бы избежать, добавив небольшое логическое значение.

return_list - это именно то, что вам нужноэто будет ['thyme', 'youthy', 'youthem']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...