迭代类中的“Self”变量(属性错误)

2024-09-29 21:35:40 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我不确定这个标题是否有意义,但基本上我有一个跟踪朋友的类(比如一个地址簿),我需要创建一个函数,将朋友添加到一组现有的名字中。所以我的代码开头是:

class SocialAddressBook:
    def __init__(self):
        self.book= []


    def addName(self, name, address):
        self.book.append([name, address, set()])
        """Adds name to address book, with address and no friends"""

运行良好。然后给我'list' object has no attribute 'list'错误的部分:

def addFriend(self, name, friend):
    for k in range(len(self.book.list[k])):
        if self.book[k][0] == name:

我的想法是迭代一个列表并添加到现有的列表中,但是语法肯定会让我陷入循环(没有双关语的意思),我不确定现在该怎么做。你知道吗

一些测试代码:

a.addFriend('Fred', 'Barb'); a.addFriend('Fred', 'Sue')
a.addFriend('Barb', 'Jane'); a.addFriend('Jane', 'Emma')
a.addFriend('Jane', 'Mary'); a.addFriend('Emma', 'Lisa')

谢谢你!你知道吗


Tags: nonameself标题列表addressdef朋友
2条回答

方法中的for循环不正确。具体来说,self.book.list[k]。你知道吗

首先,self.book是一个列表,列表没有list属性。其次,您不能在那里使用k,因为它还不存在。你知道吗

如果你想循环一个列表,为什么不这样做呢?您不需要使用range()。你知道吗

for book in self.book:
    if book[0] == name:
        pass

如果可以,应该使用字典而不是列表来实现解决方案,以提高通讯簿的性能。添加名字很简单,除了检查错误之外,添加朋友也很简单。为了获得更完整的解决方案,添加了一个remove_name方法,显示如何正确地删除某人。你知道吗

import collections


def main():
    book = SocialAddressBook()
    # Add people to the address book.
    book.add_name('Fred', 'fred@gmail.com')
    book.add_name('Barb', 'barb@gmail.com')
    book.add_name('Jane', 'jane@gmail.com')
    book.add_name('Emma', 'emma@gmail.com')
    book.add_name('Sue', 'sue@gmail.com')
    book.add_name('Mary', 'mary@gmail.com')
    book.add_name('Lisa', 'lisa@gmail.com')
    # Add friends connections in the address book.
    book.add_friend('Fred', 'Barb')
    book.add_friend('Fred', 'Sue')
    book.add_friend('Barb', 'Jane')
    book.add_friend('Jane', 'Emma')
    book.add_friend('Jane', 'Mary')
    book.add_friend('Emma', 'Lisa')


class SocialAddressBook:

    def __init__(self):
        self.__book = {}

    def add_name(self, name, address):
        """Adds name to address book with address and no friends."""
        self.__book[name] = BookEntry(address, set())

    def add_friend(self, name, friend):
        """Adds a friend to the person referenced by name."""
        if friend not in self.__book:
            raise ValueError(f'{friend!r} is not in the address book yet')
        self.__book[name].friends.add(friend)

    def remove_name(self, name):
        """Completely delete someone from the address book."""
        del self.__book[name]
        for book_entry in self.__book.values():
            book_entry.friends.discard(name)


BookEntry = collections.namedtuple('BookEntry', 'address, friends')


if __name__ == '__main__':
    main()

如果可能,请尽快阅读PEP 8 Style Guide for Python Code。用Python编写的代码应该符合样式指南,以提高可维护性,并鼓励其他人阅读您的代码并回答您的问题。今后,在提出问题之前,请先解决你的问题。你知道吗

相关问题 更多 >

    热门问题