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

在python中提取字典键并将其分配给变量,python,Python,文件名.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 下面的代码在底部给出

文件名.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
下面的代码在底部给出了打印结果。我想做的是制作一个菜单驱动的程序,允许用户通过数字选择要修改的记录。在伪代码中,它看起来像这样:

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 ''  
电话列表:

  • 法恩斯沃思教授:家里999 555-5555,手机999 666-6666
  • 菲利浦·J·弗莱:家里999 111-1111,电话999 222-2222
  • 本德B.罗德里格斯:999 333-3333号住宅,999 444-4444号牢房
  • 黄,艾米:家里999-9999,电话999 101-1010
  • 图兰加利拉: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'}  
    }  
    

    如果您只需要一本有序字典,请使用集合。有序字典

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

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


    list(my_dict.keys())[index]
    如果您只需要一个有序的字典,请使用
    集合。有序的dict

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

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

    list(my_dict.keys())[index]
    较新的python(python 2.7+)版本在
    集合中有一个有序的字典类型。但是(据我所知),您仍然无法按索引访问该字典。我建议在字典旁边保留一个有序的数据类型(如列表)。然后,当您想通过索引获取值时,只需执行
    mydict[mylist[i]]
    。您可以通过对dict进行子类化使其更美观一些,但本质上这就是想法

    实际上,如果您想通过索引获取数据,那么最好还是使用
    列表作为您的数据结构……这样做的好处是,您可以对数据进行排序(例如按字母顺序排序),并保持其顺序。

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


    实际上,如果您想通过索引获取数据,那么最好还是使用
    列表作为数据结构……这样做的好处是您可以对其进行排序(例如,按字母顺序排序)尽管我认为整个设计是错误的,因为一旦你有了一个巨大的电话簿,我认为打印它并让用户选择没有任何意义

    但是,如果要绑定名称和用户选择(编号),可以在向用户打印时创建字典:

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

    然后,为了得到王的手机号码,艾米,你可以
    打印pBook[user_choices[4]][cell']

    尽管我认为整个设计是错误的,因为一旦你有了一个巨大的电话簿,我看不到打印它和让用户选择的任何意义

    但是,如果要绑定名称和用户选择(编号),可以在向用户打印时创建字典:

    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您可以
    打印pBook[user_choices[4]['cell']

    我假设您在
    #populate pBook
    下的
    循环中有一个缩进错误,否则您不会用很多内容填充它。您使用了错误的数据结构。使用
    列表,而不是
    dict
    ,您的问题就会消失。我假设您在
    whi中有一个缩进错误在
    #populate pBook
    下执行le
    循环,否则您不会在其中填充太多内容。您使用了错误的数据结构。使用
    列表,而不是
    dict
    ,您的麻烦就会消失。您可能应该使用
    枚举(pBook)
    而不是增加变量
    i
    你自己。@zenpoy,这非常有用。作为访问Wong的参考,代码是:>打印pBook[user_choice[str(4)]['cell'],因为一个字符串被传递给key,我还将尝试其他建议。@MichaelSwartz i f