У объекта 'list' нет атрибута 'lower' в Python - PullRequest
0 голосов
/ 12 ноября 2018

функция anagrams (s1, s2) является булевозначной функцией, которая возвращает true только в том случае, если строка s1 содержит те же буквы, что и строка s2, но в другом порядке. Функция должна быть без учета регистра - другими словами, она должна возвращать то же значение, если какие-либо буквы в s1 или s2 изменяются с верхнего на нижний регистр или с нижнего на верхний регистр. Вы можете предположить, что входные строки содержат только буквы. enter image description here

Функция find_all_anagrams (string) принимает строку в качестве входных данных и возвращает список всех слов в файле english_words.txt, которые являются анаграммами входной строки. функция должна возвращать список [word1, ..., wordN], так что каждое слово в этом списке является словом в файле словаря, так что анаграммы функции значения (строка, слово) имеют значение True

def anagrams( string1, string2 ):
    str_1 = string1.lower()
    str_2 = string2.lower()
    if str_1 == str_2:
        return False
    else:
        list_1 = list( str_1 )
        list_1.sort()
        list_2 = list( str_2 )
        list_2.sort()
        return list_1 == list_2

def find_all_anagrams( string ):
    with open("english_words.txt") as f:
        word_list = []
        for line in f.readlines():
            word_list.append(line.strip())
        list1 = [i.split() for i in word_list]
    for j in list1:
        if anagrams( string, j ) == True:
            return list1
        else:
            return []

ОШИБКА постоянно повторяла это: AttributeError: у объекта «список» нет атрибута «нижний»

например, список слов содержит: ['pyruvates', 'python', 'pythoness', 'pythonesses', 'pythonic', 'pythons', 'pyuria', 'pyurias', 'pyx', 'pyxes']

Ожидаемый результат ниже enter image description here Часть текстового файла показана справа: enter image description here

Обновление: Я думаю, что я только что решил, вот мои коды:

def find_all_anagrams( string ):
    list1 = []
    with open("english_words.txt") as f:
        word_list = []
        for line in f.readlines():
            word_list.append(line.strip())
    for i in word_list:
            if anagrams( string, i ):
                list1.append(i)
    return list1

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы используете функцию split () в этой части:

list1 = [i.split() for i in word_list] 

Давайте посмотрим, что документация говорит нам об этой функции:

str.split (sep = Нет, maxsplit = -1)

Возвращает список слов в строка, используя sep в качестве строки-разделителя. Если дается макссплит, в большинство разделений maxsplit сделано (таким образом, список будет иметь самое большее maxsplit + 1 элемент). Если maxsplit не указан или -1, то есть количество разделений не ограничено (сделаны все возможные разбиения).

Возвращает список, и вы добавили этот список в свой список. Я вижу, что word_list предназначен для хранения строк слов. Давайте предположим, что word_list выглядит так:

word_list = ["hello darkness my", "old friend I've", "come to see you", "again"]

Что происходит после list1 = [i.split() for i in word_list]?

list1 = [i.split() for i in word_list]
print(list1)

Вывод:

[['hello', 'darkness', 'my'], ['old', 'friend', "I've"], ['come', 'to', 'see', 'you'], ['again']]

Как видите, элементы - это отдельные списки. На этой части вашего кода:

for j in list1:
    if anagrams( string, j ) == True:
        return list1
    else:
        return []

j - список, поэтому здесь:

def anagrams( string1, string2 ):
    str_1 = string1.lower()
    str_2 = string2.lower()

str_2 = string2.lower() пытается вызвать более низкий метод в списке, который не является допустимым методом для объекта list, и именно поэтому Python жалуется.

Понимание списка может выглядеть «круто», но часто использование простых циклов улучшает читабельность вашего кода, а в некоторых случаях может даже избежать ошибок, подобных этой. Вот моя альтернатива:

list1 = []
for i in word_list:
  for word in i.split():
    list1.append(word)

см. Вывод:

print(list1)
['hello', 'darkness', 'my', 'old', 'friend', "I've", 'come', 'to', 'see', 'you', 'again']

Отдельные слова, как вы и хотели.

0 голосов
/ 12 ноября 2018

Как указано в сообщении об ошибке, список не имеет атрибута .lower Я думаю, что вы имели в виду, чтобы получить доступ к строке в списке с атрибутом .lower. Например:

mylist[index].lower()

где индекс соответствует позиции строки в списке.

...