【问题标题】:Python 2.7 - min built-in function not working as expectedPython 2.7 - min 内置函数未按预期工作
【发布时间】:2013-07-26 17:13:18
【问题描述】:

我正在做 Google Python 练习,但不理解 min() 内置函数的行为,这似乎没有产生预期的结果。 练习是“babynames”,我正在使用“baby1990.html”文件测试代码 (https://developers.google.com/edu/python/exercises/baby-names)

def extract_names(filename):
    f = open(filename, 'r').read()
    res = []
    d = {}
    match = re.search(r'<h3(.*?)in (\d+)</h3>', f)
    if match:
            res.append(match.group(2))

    vals = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f)
    for n, m, f in vals:
            if m=='Adrian' or f=='Adrian':
                    if m not in d:
                            d[m] = n
                    else:
                            d[m] = min(n, d[m])

                    if f not in d:       
                            d[f] = n
                    else:
                            print "min( "+str(n)+", "+str(d[f])+") = "+str( min(n, d[f]) ) 
                            d[f] = min( [n, d[f]] )

    for name,rank in sorted(d.items()):
    res.append(name+" "+str(rank))

    return res

vals 是一个元组列表(rank、male_name、female_name),我想存储每个名字 (男性和女性)在字典“d”中,名称为键,排名为值。 如果有重复,我想保留较低的排名值。

我注意到名字“Adrian”在集合中出现了两次,第一次是男性名字,排名 94,第二次是女性,排名 603,我想要两个值中较小的一个。

所以,第一次匹配 'Adrian' 时,它被存储在排名为 94 的字典中(正确)。第二次匹配时,执行流程正确进入第二个if的第二个分支,但是结果变成了603,即使min(94, 603) = 94。 所以结果是:

min( 603, 94) = 603
1990
Adrian 603
Anton 603
Ariel 94

我不明白错误在哪里。正如预期的那样,通过解释器,min(94, 603) = 94。我错过了什么?

感谢您的帮助

PS:我也试过 最小(n,d[f]) 那是没有列表的相同函数,但结果始终是 603

【问题讨论】:

    标签: python dictionary min built-in


    【解决方案1】:

    您正在比较字符串,不是数字:

    >>> min('603', '94')
    '603'
    

    按字典顺序,'6' 排在'9' 之前。正则表达式适用于字符串,即使数字匹配,返回的匹配项也是字符串。使用int() 将字符串转换为整数:

    vals = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f)
    for n, m, f in vals:
        n = int(n)
        # ...
    

    尝试调试Python代码时,使用repr()而不是str()来检测类型问题;如果您使用过repr(),您会看到'94' 将被打印而不是94(因此用引号表示字符串)。

    【讨论】:

    • 错字:“你用过str() 你会......”应该说repr()(我会自己编辑,但我不想知道SO如何处理并发编辑.)
    • @delnan:啊,应该更好地阅读,而不是关注评论中的错字。 :-P
    • 感谢您的快速回复。我永远不会找到这个!但是为什么 603 是 int 而不是 string?
    • @jsil: '603' 也是一个字符串;我最初的诊断有点过分,从那以后我已经调整了我的答案。
    • 非常感谢!!很有帮助!
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2015-12-25
    • 2019-10-30
    • 2015-04-11
    相关资源
    最近更新 更多