【问题标题】:python for loops and dictionary valuespython for循环和字典值
【发布时间】:2015-06-11 17:59:13
【问题描述】:

我正在学习 python 并尝试制作电话簿。相当标准的练习,但我在尝试让我的搜索功能遍历字典中的每个值时遇到问题。如果匹配,它只会返回第一项,否则它只会返回None,我不确定我做错了什么。

无特殊原因使用 python 2.6。

phonebook = {"id": 1, "fname" : "Mario", "lname": "Mario", "phone": "XXX-XXX-XXXX"}, \
        {"id": 2, "fname" : "Luigi", "lname": "Mario", "phone": "505-123-4567"}

def search_fname(name):
    name = str.capitalize(name)
    for n in phonebook:
        if name == n["fname"]:
            return n["id"]
        else:
            print "No match found."
            return 0

def search():
    name = raw_input("Please enter the first name: ")
    pid = search_fname(name)
    if pid != 0:
        for n in phonebook:
            if n["id"] == pid:
                print n["fname"], n["lname"], n["phone"]

【问题讨论】:

    标签: python for-loop dictionary


    【解决方案1】:

    在第一次测试时返回

    for n in phonebook:
        if name == n["fname"]:
            return n["id"]
        else:
            print "No match found."
            return 0
    

    因此,如果绑定到n 的电话簿中的第一个条目是匹配项(即name = "Mario"),则返回n['id'],否则返回0。您的 for 循环永远不会在此处迭代电话簿的其余部分,因为您已经退出了该函数。

    完全删除else 块;在您尝试所有条目之前,您不会知道是否没有匹配项,因此请将您的 print 放在 for 循环之后:

    for n in phonebook:
        if name == n["fname"]:
            return n["id"]
    
    print "No match found."
    return 0
    

    【讨论】:

    • 我猜他还需要打印所有匹配项。考虑到这一行搜索函数遍历字典中的每个值,所以这意味着他必须将匹配的值存储在某个地方并作为列表返回。 :/ 或者我误解了这个问题
    • @BhargavRao:代码返回电话簿中的第一项(如果匹配)。他们只需要返回一个匹配项,但除非您输入 Mario,否则它将永远不会匹配任何其他内容,因为只测试了第一个条目。
    • @BhargavRao:换句话说,他们描述的是症状,而不是要求。
    • 是的。知道了。但是对于电话簿,让代码返回所有匹配的字符串会是一个更好的主意,但无论如何都留给 OP 来决定。泰:)
    【解决方案2】:

    修改了您的代码以不提前返回,如果有多个匹配项,它现在会捕获并返回所有匹配项。

    def search_fname(name):
        name = str.capitalize(name)
    
        entries = []
    
        for n in phonebook:
            if name == n["fname"]:
               entries.append("{}, {}, {}"
                              .format(n["fname"], n["lname"], n["phone"])
                              )
    
        if len(entries) > 0:
            return entries
    
        return 0
    
    def search():
        name = raw_input("Please enter the first name: ")
        pids = search_fname(name)
        if pids != 0:
            for pid in pids:
                print(pid)
    
    search()
    

    【讨论】:

    • 为什么不直接返回空列表呢? if not pids: 适用于空列表和 0,但空列表表明没有匹配项一样多,但一致。
    • 而格式化的责任应该在打印的函数中,所以我只使用entries.append(n)
    【解决方案3】:

    如果你想得到多个结果,你不应该在循环结束之前返回任何东西。 “return” 会中断循环,因此在第一个结果(如果有)之后不会找到其他结果。

    如果您希望能够返回多个,则应将结果添加到列表中,如果没有找到则为空,如果有则包含所有结果。此代码列出了为给定名称找到的条目。请注意,我并没有只返回 id,而是返回完整的对象,因此您不必再次通过循环来获取 search() 中的数据。

    def search_fname(name):
        name = str.capitalize(name)
        found = []
        for n in phonebook:
            if name == n["fname"]:
                found.append(n)
        return found
    
    def search():
        name = raw_input("Please enter the first name: ")
        entries = search_fname(name)
        for n in entries:
            print n["fname"], n["lname"], n["phone"]
    

    在 python2.7 上测试。如果您正在学习,可以考虑使用最新版本的 python。

    【讨论】:

    • 非常感谢!你的解释让它点击了!
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多