在python中提取字典键并将其分配给变量
文件名.dat的外观与此完全相同:在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 下面的代码在底部给出
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表示否
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, 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