1

文件名.dat 看起来完全像这样:

Fry, Philip J.;999 111-1111;999 222-2222  
Rodriguez, Bender B.;999 333-3333;999 444-4444  
Farnsworth, Professor;999 555-5555;999 666-6666  
Leela, Turanga;999 777-7777;999 888-8888  
Wong, Amy;999 999-9999;999 101-1010

下面的代码在底部给出了打印结果。我想做的是制作一个菜单驱动程序,允许用户按数字选择他们想要修改的记录。在伪代码中,它看起来像这样:

  • 第一个带有编号电话列表的代码块在这里
  • 按编号输入要修改的记录
  • 用户输入 3
  • 对于 Rodriguez,Bender B 输入 ac 修改手机或输入 h 修改家庭电话
  • 用户输入 h
  • 输入不带空格的 10 位电话号码
  • 用户输入 7771234567
  • 记录被改变
  • 输入 p 以查看修改后的电话簿(这将显示所有记录,但 Bender 使用不同的电话
  • 你想再做一次修改吗?y 表示是,n 表示否

我的问题是我找不到将主键绑定到输入的用户号码的方法。由于 python 字典没有顺序,我发现这很难做到。有人可以帮忙吗?我只需要这个,剩下的我自己做。

pBook = {}  
fp = open('names.dat')  

# populate pBook  
while 1:  
    line = fp.readline()  
    if not line:  
        break  
x = line[:-1]  
data = x.split(';')  
pBook[data[0]] = {'home': data[1], 'cell': data[2]}  
fp.close()  

# optional if you want to see the dictionary structure   
# print pBook  

i = 1  
print '\nPhone listings:\n'  
for record in pBook:  
    key = str(i)  
    i += 1  
    print key + ')', record + ':', 'Home', pBook[record]['home'] + ',', 'Cell', pBook[record]['cell']  
print ''  

电话清单:

  1. Farnsworth,教授:家庭 999 555-5555,细胞 999 666-6666
  2. Fry, Philip J.:家庭 999 111-1111,牢房 999 222-2222
  3. Rodriguez, Bender B.:家庭 999 333-3333,牢房 999 444-4444
  4. 黄,艾米:家庭 999 999-9999,牢房 999 101-1010
  5. Leela,Turanga:家庭 999 777-7777,细胞 999 888-8888

填充后打印 pBook 的结果,为这篇文章格式化,以便更容易理解它的结构。主键是人名,值是另一个字典,其中“cell”和“home”是键,电话号码是各自的值。

{  
'Farnsworth, Professor': {'cell': '999 666-6666', 'home': '999 555-5555'},  
'Fry, Philip J.': {'cell ': '999 222-2222', 'home': '999 111-1111'},  
'Rodriguez, Bender B.': {'cell': '999 444-4444', 'home': '999 333-3333'},  
'Wong, Amy' : {'cell': '999 101-1010', 'home': '999 999-9999'},  
'Leela, Turanga': {'cell': '999 888-8888', 'home': '999 777-7777'}  
}  
4

3 回答 3

1

虽然我认为整个设计是错误的,因为一旦你将拥有一个巨大的电话簿,我认为打印它并让用户选择没有任何意义。

但是,如果您想绑定名称和用户选择(数字),您可以在将其打印给用户时创建一个字典:

user_choices = {}
i = 1  
print '\nPhone listings:\n'  
for record in pBook:  
    key = i
    user_choices[key] = record 
    i += 1  
    print str(key) + ')', record + ':', 'Home', pBook[record]['home'] + ',', 'Cell', pBook[record]['cell']  
print '' 

然后获取Wong的手机号,Amy就可以了print pBook[user_choices[4]]['cell']

于 2012-07-18T13:15:52.947 回答
0

如果您只需要一个有序的字典,请使用collections.OrderedDict

在 Python2.7 中,您可以使用或通过索引访问键或my_dict.keys()[index]my_dict.values()[index]

正如@mgilson 所指出的,这在 3.0 中不起作用,因为它返回一个不支持索引的 ValuesView 对象,但您仍然可以将其强制转换为如下列表:

list(my_dict.keys())[index].

于 2012-07-18T13:09:26.733 回答
0

较新的(python 2.7+)版本的 python 有一个有序的字典类型 in collections.OrderedDict,但是(据我所知),您仍然无法通过索引访问该字典。我建议在字典旁边保留一个有序的数据类型(如列表)。然后,当您想通过索引获取值时,您只需执行mydict[mylist[i]]. 您可能可以通过子类化 dict 使它更漂亮一些,但本质上就是这样。

真的,如果你想通过索引获取数据,你可能最好还是使用 alist作为你的数据结构......这有一个优势,你可以对它进行排序(例如按字母顺序)并保持它的顺序。

于 2012-07-18T13:15:08.737 回答