【问题标题】:extracting a dictionary key and assigning it to a variable in python提取字典键并将其分配给python中的变量
【发布时间】:2012-07-17 12:45:03
【问题描述】:

文件名.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 输入 a 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,教授:家庭 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. Wong, Amy:家庭 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'}  
}  

【问题讨论】:

  • 我假设您在 #populate pBook 下的 while 循环中存在缩进错误,否则您不会填充太多内容。
  • 您使用了错误的数据结构。使用list,而不是dict,您的烦恼就会消失。

标签: python


【解决方案1】:

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

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

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

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

【讨论】:

  • 像这样直接访问键/值可能不适用于 python 3.x,因为这些方法返回不支持索引的视图对象。
  • 啊,没有意识到,我使用的是 2.7,所以它工作正常。感谢您指出这一点。
【解决方案2】:

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

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

【讨论】:

  • 是的,使用列表非常容易。我以这种方式解决它没有任何问题。我有兴趣看看是否可以使用字典来完成。我有其他编程经验,但我是 python 新手,我还没有看到使用字典更有意义的真实世界情况。也许我错了,但因为它们没有固有的顺序,所以很难使用它们,特别是如果主键不类似于整数。我想这在一定程度上就是为了……表明与他们合作是多么困难。
  • @MichaelSwartz -- 考虑这样一种情况,您希望通过此人的姓名而不是该人的位置来访问您的电话目录电话簿。在这种情况下,字典非常有用。通常你并不关心你的对象的顺序,你只关心你对你想要的对象有一个简单的处理。
  • 我可以看到,特别是因为在这种情况下,主键是一个人的名字,但在这种情况下,我发现用户通过数字访问记录而不是让他们输入名字。
  • @MichaelSwartz -- 是的,如果你想要有顺序的记录,那么你想要一个列表。如果您想要基于非整数的随机访问,字典很适合。考虑具有简单属性的类。 a.foo=3 可以使用字典 a['foo']=3 轻松完成。事实上,这正是 python 所做的(以某种优化的方式)。
【解决方案3】:

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

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

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

【讨论】:

  • 您可能应该使用enumerate(pBook),而不是自己增加变量i
  • @zenpoy,这很有帮助。作为访问 Wong 的 FYI,代码是:> print pBook[user_choice[str(4)]]['cell'] 因为一个字符串被传递给 key,我也会尝试其他建议。
  • @MichaelSwartz 我修复了代码 - 密钥现在是 int 而不是 string
  • @zenpoy --- 感谢您的帮助,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多