文件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
以下代码将打印结果显示在底部。我想要做的是制作一个菜单驱动的程序,允许用户按编号选择他们想要修改的记录。在伪代码中,它看起来像这样:
我的问题是我找不到将主键绑定到输入的用户号码的方法。因为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 ''
手机列表:
- Farnsworth,教授:Home 999 555-5555,Cell 999 666-6666
- Fry,Philip J。:Home 999 111-1111,Cell 999 222-2222
- Rodriguez,Bender B。:Home 999 333-3333,Cell 999 444-4444
- Wong,Amy:Home 999 999-9999,Cell 999 101-1010
- Leela,Turanga:Home 999 777-7777,Cell 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'}
}
答案 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
作为你的数据结构...这样做的好处是你可以对它进行排序(按字母顺序排序)例子)它保持秩序。