提取字典键并将其分配给python中的变量

时间:2012-07-18 13:05:06

标签: python

文件names.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输入c修改手机或输入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,教授:Home 999 555-5555,Cell 999 666-6666
  2.   
  3. Fry,Philip J。:Home 999 111-1111,Cell 999 222-2222
  4.   
  5. Rodriguez,Bender B。:Home 999 333-3333,Cell 999 444-4444
  6.   
  7. Wong,Amy:Home 999 999-9999,Cell 999 101-1010
  8.   
  9. Leela,Turanga:Home 999 777-7777,Cell 999 888-8888
  10.   

打印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'}  
}  

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

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

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

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

list(my_dict.keys())[index]

答案 2 :(得分:0)

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

真的,如果你想通过索引获取数据,你可能最好还是使用list作为你的数据结构...这样做的好处是你可以对它进行排序(按字母顺序排序)例子)它保持秩序。