function anagrams(s1,s2)是一个布尔值函数,当字符串s1包含与字符串s2相同的字母但顺序不同时,它返回true。该函数应不区分大小写-换句话说,如果s1或s2中的任何字母从大写变为小写或从小写变为大写,则该函数应返回相同的值。您可以假定输入字符串仅包含字母。
函数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:'list'对象没有属性'lower'
例如,word_list包含: ['pyruvates','python','pythoness','pythonesses','pythonic','pythons','pyuria','pyurias','pyx','pyxes']
更新: 我想我已经解决了,这是我的代码:
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
答案 0 :(得分:1)
如错误消息所示,列表没有属性.lower
我想您想做的是使用.lower
属性访问列表中的字符串。
例如:
mylist[index].lower()
其中索引对应于列表中的字符串位置。
答案 1 :(得分:1)
您正在使用split()功能:
list1 = [i.split() for i in word_list]
让我们看看有关该功能的文档:
str.split(sep = None,maxsplit = -1)
返回列表中的单词 字符串,使用sep作为分隔符字符串。如果给出了maxsplit,则位于 大多数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()
试图在列表上调用lower方法,这不是list
对象的有效方法,这就是Python抱怨的原因。
List Comprehension看起来很“酷”,但是经常使用简单的循环可以提高代码的可读性,在某些情况下甚至可以避免此类错误。这是我的选择:
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']
按您的意图输入单个字