2

如前一个(但不同的)问题所述,我试图用 Python 找出一个“简单”的字典/数据库,它将从十个列表中检索一个名称,并带有请求的信息。即输入可以是'John phone',输出是'John's phone number is 0401'(我已经记下来了);但我也可以输入“John Birthday”或“John hobbies”,输出会对应。

由于我是一个完整的菜鸟,我什至不知道从哪里开始。到目前为止,几个小时的谷歌搜索和仔细研究讲义并没有产生任何结果。我感觉它与多参数 % 函数有关,但我们的讲师真的不清楚如何进一步发展。到目前为止,我所拥有的是:

#!/usr/bin/python

friends = {'John': {'phone' : '0401',
                    'birthday' : '31 July',
                    'address' : 'UK',
                    'interests' : ['a', 'b', 'c']},
           'Harry': {'phone' : '0402',
                    'birthday' : '2 August',
                    'address' : 'Hungary',
                    'interests' : ['d', 'e', 'f']}}
name = raw_input ('Please enter search criteria: ')
if name in friends: 
    print "%s's phone number is: %s" % (name, friends[name]['phone'])
else: 
    print 'no data'

我还想使用“while”功能,这样程序就不会在给出该信息后立即关闭,但不确定这是否合适。任何指针都会很棒,即使它是“试试这个”的提示,或者是指向相关网站的链接。

4

3 回答 3

5

由于这是家庭作业,我将把答案限制在一些提示上:

  1. tok = name.split()将拆分name为单词列表,因此'John address'将成为['John', 'address'].
  2. 您可以访问单个单词tok[0]tok[1],并使用它们来索引friends以获取相关人员,然后是相关字段。
  3. 我认为将输入/搜索逻辑包装到一个while循环中没有问题,以便用户可以执行多个查询。唯一要弄清楚的是您将如何退出该循环。
于 2012-05-04T16:10:04.733 回答
2

根据您的示例代码,“John phone”不起作用,因为它实际上会查找“John phone”作为名称(并且“phone”是硬编码的)。为了说明,试试这样的代码:

response = raw_input('Please enter search criteria: ').split()

try:
    print "%s's %s is %s" % (response[0], response[1], friends[response[0]][response[1]])
except KeyError:
    print 'no data'

split() 分别接受每个参数,然后可以用 [0] 和 [1] (依此类推)引用。您已经在使用 % 替换的正确轨道上,但是这种方法将赋予它更多的可用性和可读性。

关键是您不需要检查名称是否匹配(或条件匹配)。假设它会在那里——并且在出现例外情况(未找到匹配项)时,它可以按预期返回“无数据”。

Please enter search criteria: John phone
John's phone is 0401

Please enter search criteria: Harry birthday
Harry's birthday is 2 August
于 2012-05-04T16:15:18.930 回答
0

听 aix 来回答你问题的第一部分。对于第二部分,我建议提出一个退出值(也许是“退出”),用户可以键入退出程序,然后让你的 while 循环继续进行,而输入不是那个值。

于 2012-05-04T16:12:38.260 回答