2017-03-28 19 views
2

タイトルが意味をなさないとは分かりませんが、基本的には(アドレス帳のような)友達を追跡するクラスがあります私は既存の名前のセットに友人を追加する関数を作成する必要がある部分です。だから、私のコードの初めは次のようになっています。"Self"変数をクラス内で反復する(属性エラー)

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') 

ありがとうございました!

+0

なぜ 'self.book.list'をやっているのですか?リストには' list'プロパティがあると思います。 –

+1

通常、Pythonのコレクションを反復処理するためのインデックスは必要ありません。単にbook_name、address、friendsの場合はself.book: '、次にif if book_name == name:'は、何が後になるかによって決まります。おそらく 'friends.add(friend)'でしょうか? –

答えて

4

お客様のループのforループが正しくありません。具体的には、self.book.list[k]

まず、self.bookがリストで、リストにlistプロパティがありません。第二に、kはまだ存在しないため、そこには使用できません。

リストをループしたいのであれば、それだけじゃないの? range()を使用する必要はありません。

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

説明に感謝します、私はそれを感謝します – plshalp

+0

あなたは大歓迎です!より高度なコーディングのために、 'for'ループの値を実際に*アンパックすることができます。 'for b_name、b_address、b_set for self.book:' book [0] 'の代わりに' b_name'を使うことができます。 –

2

することができます場合は、あなたのソリューションは、あなたのアドレス帳のパフォーマンスを改善するために、リストの代わりに辞書を使用して実装する必要があります。名前の追加は簡単ではなく、エラーチェック以外に友人を追加することも簡単です。より完全な解決策として、正しく削除する方法を示すremove_nameメソッドが追加されました。

import collections 


def main(): 
    book = SocialAddressBook() 
    # Add people to the address book. 
    book.add_name('Fred', '[email protected]') 
    book.add_name('Barb', '[email protected]') 
    book.add_name('Jane', '[email protected]') 
    book.add_name('Emma', '[email protected]') 
    book.add_name('Sue', '[email protected]') 
    book.add_name('Mary', '[email protected]') 
    book.add_name('Lisa', '[email protected]') 
    # 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で書かれたコードは、スタイルガイドに準拠して、メンテナンス性を促進し、他の人があなたのコードを読んで質問に答えるよう促すべきです。今後、質問をする前に、問題のcreate a Minimal, Complete, and Verifiable exampleをご記入ください。

関連する問題