2015-10-15 84 views
0

我要在Python中创建一个电话簿应具备以下功能:Python的更新别名和家长

  • 添加名称数量 - 增加了数量字典。名称必须是唯一的,也是数字。
  • 查找 - 打印相关
  • 别名名NEWNAME数 - 允许被搜索从NEWNAME
  • 变化名称数量 - 更改相关的数字与现有的
  • 戒 - 退出程序

运行的程序应该是这样的:

telebok> add peter.forsberg 12345 
telebok> lookup peter.forsberg 
12345 
telebok> alias peter.forsberg foppa 
telebok> lookup foppa 
12345 
telebok> alias foppa MR21 
telebok> change MR21 67890 
telebok> lookup peter.forsberg 
67890 

我得到的一切,除了换个工作:

def adressbook(): 
telebook = {"jacob.engert":"8472923777", "nisse":"092563243"} 
while True: 
    book = raw_input("telebook> ").lower() 
    lista = book.split() 
    if "add" in lista[0]: 
     n = lista[1] 
     x = lista[2] 
     if x in telebook.values(): 
      print "Number already exists!" 
     elif n in telebook: 
      print "Name already exists!" 
     else: 
      telebook[n] = x 
      print telebook 
    elif "lookup" in lista[0]: 
     n = lista[1] 
     if n in telebook: 
      print n, "", telebook[n] 
     elif n.isdigit(): 
      print "Type only characters!" 
     else: 
      print "This person does not exist!" 
    elif "alias" in lista[0]: 
     n = lista[1] 
     alias = lista[2] 
     if n in telebook: 
      v = telebook.get(n) 
      telebook[alias] = v 

    elif "change" in lista[0]: 
     key = lista[1] 
     value = telebook.get(key) 
     newvalue = lista[2] 
     for key, value in telebook.items(): 
      telebook.update({key:newvalue}) 
      print telebook 

所以,当我更新的别名,我想要更新原件,但我得到这个结果:

>>> adressbook() 
telebook> add ove 345347657 
{'jacob.engert': '8472923777', 'ove': '345347657', 'nisse': '092563243'} 
telebook> alias ove mr.o 
telebook> lookup mr.o 
mr.o 345347657 
telebook> change mr.o 534523234 
{'mr.o': '534523234', 'jacob.engert': '8472923777', 'ove': '345347657', nisse': '092563243'} 
{'mr.o': '534523234', 'jacob.engert': '534523234', 'ove': '345347657', 'nisse': '092563243'} 
{'mr.o': '534523234', 'jacob.engert': '534523234', 'ove': '534523234', 'nisse': '092563243'} 
{'mr.o': '534523234', 'jacob.engert': '534523234', 'ove': '534523234', 'nisse': '534523234'} 
telebook> 

所以我的问题是,如何才能让这个当我改变数的别名,原来的数量也将发生变化?

+1

为什么你使用你的病情'in'为'if's?这样'xaddy'的输入就可以工作。使用普通的''==相等运算 – Pynchia

+0

另外,请学习如何使用'.get'方法上的字典。如果在密钥不存在的情况下为其提供返回值,它会使生活变得更加简单。 – Pynchia

回答

0

你几乎在正确的轨道上。

为了更改所有条目(别名和父级),您需要查找与用户想要更改的条目号码相同的条目(无论是否是别名),并将其号码替换为新之一:

key = lista[1] 
newvalue = lista[2] 
present_value = telebook.get(key) 
if present_value: 
    for name, num in telebook.items(): 
     if num == present_value: 
      telebook[name] = newvalue 

或使用字典理解:

key = lista[1] 
newvalue = lista[2] 
present_value = telebook.get(key) 
if present_value: 
    upd = {name: newvalue for name, num in telebook.items() if num == present_value } 
    telebook.update(upd) 

,或者使用generator expression生成元组序列(dict.update,可同时接收)

key = lista[1] 
newvalue = lista[2] 
present_value = telebook.get(key) 
if present_value: 
    upd = ((name, newvalue) for name, num in telebook.items() if num == present_value) 
    telebook.update(upd) 
+0

感谢您的建议,看起来不错,这正是我想要的,但不幸的是我没有让你的代码工作。我使用Python 2.7.10,我在年底得到语法错误: NUM ==现值:<--- – Hacjob

+0

我非常抱歉。现在编辑 – Pynchia