“列表”对象在Python中没有属性“较低”

时间:2018-11-12 14:59:41

标签: python data-science data-analysis

function anagrams(s1,s2)是一个布尔值函数,当字符串s1包含与字符串s2相同的字母但顺序不同时,它返回true。该函数应不区分大小写-换句话说,如果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:'list'对象没有属性'lower'

例如,word_list包含: ['pyruvates','python','pythoness','pythonesses','pythonic','pythons','pyuria','pyurias','pyx','pyxes']

下面的预期输出 enter image description here 右侧显示的txt文件的一部分: 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 :(得分: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']

按您的意图输入单个字