【问题标题】:Dictionary keys not present though they are being added尽管正在添加字典键,但它们不存在
【发布时间】:2018-11-08 21:37:35
【问题描述】:

这是我的代码:

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

我无法在此代码中找到错误。 调用 add 函数时,我收到 True 消息,表明它已添加。第一个打印语句打印键数为 4,但添加链接后,键数为 7。 即使添加了链接,我也希望只有 4 个。

感谢您的帮助!

【问题讨论】:

  • 提示:尝试打印some_graph.some_dict
  • 您将member 类的实例存储在some_dict 中,但是您随后尝试在该字典中查找字符串(名称)。 member("bob")"bob"不一样,更进一步member("bob") != member("bob");它们将是具有相同名称的不同实例。
  • @mad_ 我尝试过测试。它确实给了我正确的结果。 {pqr: [], xyz: [], abc: [], mno: []}。但是,我的错误仍然存​​在。

标签: python dictionary graph key-value


【解决方案1】:

打印出有问题的字典。

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

【讨论】:

    【解决方案2】:

    您可以通过将__contains__() 方法添加到您的CreateGraph 类来解决此问题,该类需要一个名为name字符串 参数。如何做到这一点,然后使用它在下面的代码中显示。

    注意:我已将您所有的类名更改为大写单词样式以符合 PEP8 编码指南(在其 Naming Conventions 部分)。

    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
    

    【讨论】:

      【解决方案3】:

      您将实例存储为键。致电name()获取姓名 尝试如下测试

      for i in some_graph.some_dict:
          print ((i.name) in list_person)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        • 2021-07-20
        • 2016-02-17
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多