【问题标题】:Keeps only one entry instead of appending to the dictionary只保留一个条目而不是附加到字典
【发布时间】:2011-08-02 22:01:00
【问题描述】:

我想从最终用户那里获取人名和电话号码并附加到字典中。我从一本空字典开始。

在第一个用户输入数据后,程序会说添加了一个新条目并显示更新字典中的内容。到目前为止它运行良好。

当第二个用户输入数据时,它应该做同样的事情:

  1. 说添加了一个新条目
  2. 显示字典含义中的所有内容,第一个用户的输入和第二个用户的输入。但它没有按预期工作。它只显示第二个用户的输入,而不是第一个用户的输入。

有人能说出为什么这无法附加到现有数据吗?我每次只看到一个条目(谁是最新的)。

这是程序:

class phonebook:
    allphones = {} # Empty dictionary

    def __init__ (self, name, phone):
        self.pername = name
        self.perphone = phone

    def adddata(self):
        phonebook.allphones[self.pername] = self.perphone # append to the dictionary
        print ('A new phone book entry added - {0}:{1}'.format(self.pername, self.perphone)) # confirm the input
        print (phonebook.allphones) # display what is inside the phonebook  
name = input('Type person\'s name --> ')
phone = input('Type phone\'s name --> ')
adding = phonebook(name, phone)
adding.adddata()

这是更新的程序

class phonebook:

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

    def adddata(self, name, phone):
        self.allphones[name] = phone # append to the dictionary
        print ('A new phone book entry added - {0}:{1}'.format(name, phone)) # confirm the input
        print (self.allphones) # dump the complete phonebook data

name = input('Type person\'s name --> ')
phone = input('Type person\'s phone number --> ')

adding = phonebook()
adding.adddata(name, phone)

这是我得到的输出(我想要{'abc': '123', 'ghj': '505050'} 作为答案)-

>>> ================================ RESTART ================================
>>> 
Type person's name --> abc
Type person's phone number --> 123
A new phone book entry added - abc:123
{'abc': '123'}
>>> ================================ RESTART ================================
>>> 
Type person's name --> ghj
Type person's phone number --> 505050
A new phone book entry added - ghj:505050
{'ghj': '505050'} 
>>> 

【问题讨论】:

  • 请缩进您的代码。
  • 我认为您想使用raw_input 而不是input,因为后者将输入的文本评估为python表达式。

标签: python dictionary append


【解决方案1】:

用户会有不同的名字吗?如果不是,那么 Eli 的第一个答案是有道理的(他的第二个答案也很好,字典应该是实例属性,而不是类属性)。

不过,您的课程对我有用。也许不同之处在于我测试它的方式。我跳过了你的课,制作了以下文件(phonebook.py):

    class phonebook :
            allphones = {}
            def __init__ (self, name, phone):
                self.pername = name
                self.perphone = phone

            def adddata(self):
                phonebook.allphones[self.pername] = self.perphone # append to the dictionary
                print ('A new phone book entry added - {0}:{1}'.format(self.pername, self.perphone)) # confirm the input
                print (phonebook.allphones) # display what is inside the phonebook  


    AA = phonebook('Arkanaoid', '123456789')
    AA.adddata()

    BB = phonebook('Bongo', '987654321')
    BB.adddata()

如果您希望能够将多个电话号码附加到同一个人,我会 做类似的事情(警告:我还没有尝试过这段代码)

    class phonebook :
            allphones = {}
            def __init__ (self, name):
                self.pername = name

            def add_number(self, phone)
                self.perphone = phone
                phonebook.allphones.setdefault(self.pername, [])
                phonebook.allphones.append(perphone)

所以现在 allphones 是一个字典,将名称映射到数字的列表。 add_number 首先确保正确的列表存在(如果不存在则默认为 []),然后附加到它。

【讨论】:

    【解决方案2】:

    我认为你严重搞砸了什么应该是类的属性,什么不应该。可以这样想:您的电话簿类 中有一个 字典,因此字典应该是一个属性。您要添加的人的姓名和电话应该是 adddata 的参数,而不是类的实例变量。

    这个变化怎么样:

    class phonebook:
        def __init__ (self):
            self.allphones = {}  # Empty dictionary
    
        def adddata(self, pername, perphone):
            self.allphones[pername] = perphone
    
    # test code
    book = phonebook()
    book.adddata('joe', 121212)
    book.adddata('bob', 129459)
    
    print book.allphones
    

    对我来说这是打印出来的:

    {'bob': 129459, 'joe': 121212}
    

    更新:关于您的问题更新 - 不确定您想要达到什么目的? dict 在脚本调用中的持久性?请注意,您只要求一个姓名和电话并将它们添加到电话簿中。当您再次运行程序时,它又是全新的和干净的,所以当然没有保留上次调用的信息。

    如果您需要持久存储,请考虑使用pickle,或shelve,甚至是某种数据库(例如sqlite3 模块提供内置的SQLite DB 访问)

    【讨论】:

    • 感谢伊莱的指点。我已将名称、电话参数移至更有意义的 adddata 函数。但我的输出没有任何区别(我想再次接受用户的输入)
    • @Kalyan:请用您现在尝试执行的确切代码更新您的问题(但也保留旧代码,以供参考)
    • 感谢伊莱的指点。我已将名称、电话参数移至更有意义的 adddata 函数。但是我的输出没有任何区别(我想再次接受用户的输入)>>> =========================== == RESTART========================== >>> 输入人名 --> abc 输入人的电话号码 --> 12345 新电话添加了书籍条目 - abc:12345 {'abc': '12345'} >>> ============================== = RESTART =================== >>> 输入人名 --> ijk 输入人的电话号码 --> 24680 添加了一个新的电话簿条目 - ijk:24680 { 'ijk': '24680'} >>>
    • 代码在这里 class phonebook: def init (self): self.allphones = {} def adddata(self, name, phone): self.allphones[name] = phone # 追加到字典 print ('A new phone book entry added - {0}:{1}'.format(name, phone)) # 确认输入 print (self.allphones) # 转储完整的电话簿数据 name = input('键入人员姓名 --> ') phone = input('键入人员电话号码 --> ') add = phonebook() added.adddata(name, phone)
    • @Kalyan:没有机会了解这里发生了什么。 使用格式化代码编辑答案
    【解决方案3】:

    您似乎想要一个在脚本调用之间持续存在的电话簿。 shelve module 提供了一个持久的类字典对象。如果你用这样的对象替换 self.allphones 字典,那么你会得到一个持久的电话簿:

    import shelve
    from contextlib import closing
    
    try: raw_input = raw_input
    except NameError:
        raw_input = input # py3k
    
    class phonebook:
    
        def __init__ (self, filename):
            self.allphones = shelve.open(filename, protocol=1, writeback=True)
    
        def adddata(self, name, phone):
            self.allphones[name] = phone # append to the dictionary
            self.allphones.sync()
            # confirm the input
            print ('A new phone book entry added - {0}:{1}'.format(name, phone))
            # dump the complete phonebook data
            print (dict(self.allphones.items())) 
    
        def close(self):
            self.allphones.close()
    
    with closing(phonebook('.phonebook')) as adding:
        name = raw_input('Type person\'s name --> ')
        phone = raw_input('Type person\'s phone number --> ')
        adding.adddata(name, phone)
    

    如果phone 始终是不可变对象,例如字符串,则可以省略writeback=True.sync() 调用。当您想在列表对象中跟踪每个 name 的多个电话号码并使用与普通 Python 字典相同的语法来处理搁置时,您需要它们。

    示例

    $ python3 phonebook.py 
    Type person's name --> a
    Type person's phone number --> 1
    A new phone book entry added - a:1
    {'a': '1'}
    
    $ python3 phonebook.py 
    Type person's name --> b
    Type person's phone number --> 2
    A new phone book entry added - b:2
    {'a': '1', 'b': '2'}
    
    $ python phonebook.py 
    Type person's name --> c
    Type person's phone number --> 3
    A new phone book entry added - c:3
    {'a': u'1', 'c': '3', 'b': u'2'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多