Ключи словаря отсутствуют, хотя они добавляются - PullRequest
0 голосов
/ 09 ноября 2018

Это мой код:

class member:

    def __init__(self, name):
        self.name = name

    def get_name(self, name):
        self.name = name

    def __str__(self):
        return self.name

class create_graph:

    def __init__(self):
        self.some_dict = dict()

    def add(self, name):
        if name is None:
            raise TypeError
        print(name not in self.some_dict)
        if name not in self.some_dict:
            self.some_dict[name] = []
        else:
            print(str(name) + "is already present")

    def link(self, p1, p2):
        if p1 in self.some_dict:
            self.some_dict[p1].append(p2)
        else:
            self.some_dict[p1] = [p2]

some_graph = create_graph()

list_person = ['abc', 'xyz', 'mno', 'pqr']

for person in list_person:
    some_graph.add(member(person))

print(len(some_graph.some_dict))

for i in range(len(list_person)-1):
    some_graph.link(i,i+1)

print(len(some_graph.some_dict))

Я не могу найти ошибку в этом коде. Когда вызывается функция добавления, я получаю сообщение True, указывающее, что оно добавлено. Первый оператор print печатает, что количество ключей равно 4, но после добавления ссылок говорится, что количество ключей равно 7. Я хочу иметь только 4 даже после добавления ссылки.

Спасибо за помощь!

Ответы [ 3 ]

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

Вы храните экземпляры в качестве ключа. позвоните name() чтобы узнать имя попробуйте проверить, как показано ниже

for i in some_graph.some_dict:
    print ((i.name) in list_person)
0 голосов
/ 09 ноября 2018

Вы можете решить эту проблему, добавив метод __contains__() в свой класс CreateGraph, который ожидает аргумент string с именем name. Как это сделать, а затем использовать его, как показано в коде ниже.

Примечание: Я изменил все имена ваших классов на стиль CapitalizedWords, чтобы соответствовать правилам кодирования PEP8 (в разделе Условные обозначения ).

class Member:
    def __init__(self, name):
        self.name = name

    def get_name(self, name):
        self.name = name

    def __str__(self):
        return self.name


class CreateGraph:
    def __init__(self):
        self.some_dict = dict()

    def add(self, name):
        if name is None:
            raise TypeError

        if name not in self.some_dict:
            self.some_dict[name] = Member(name)
        else:
            print("{} is already present".format(name))

    def __contains__(self, name):  # <-- METHOD ADDED.
        return name in self.some_dict


some_graph = CreateGraph()

list_person = ['abc', 'xyz', 'mno', 'pqr']

for person in list_person:
    some_graph.add(person)

print("checking these names in list_person:", list_person)
for person in list_person:
    if person in some_graph:
        print("Present")
    else:
        print("Not present")

Вот вывод:

checking these names in list_person: ['abc', 'xyz', 'mno', 'pqr']
Present
Present
Present
Present
0 голосов
/ 09 ноября 2018

Распечатайте соответствующий словарь.

print(some_graph.some_dict)

производит

{<__main__.member object at 0x7fe8326abe80>: [], <__main__.member object at 0x7fe8326abeb8>: [], <__main__.member object at 0x7fe8326abe48>: [], <__main__.member object at 0x7fe8326abef0>: []}

Ключи этого словаря являются экземплярами класса member, а не строками в списке list_person.

Я тебя сделал:

persons_in_graph_dict = {k.name for k in some_graph.some_dict}
for person in list_person:
    print(person)
    print(person in persons_in_graph_dict)
    print()

Вы получите:

abc
True

xyz
True

mno
True

pqr
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...