我正在做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是元组的列表(等级,男性名称,女性名称),我想存储每个名称
(男性和女性)字典“ d”中,名称为键,等级为值。
如果有重复,我想保留较低的等级值。
我注意到“ Adrian”这个名称在集合中出现了两次,第一次是男性,排名为94,第二次是女性,排名为603,我希望这两个值中的较小者。
因此,第一次匹配“ Adrian”时,它以正确的等级存储在字典中,排名为94。如果第二次匹配,则执行流正确地进入第二个分支的第二个分支,但是即使min(94,603)= 94,结果也变成603。
所以结果是:
min( 603, 94) = 603
1990
Adrian 603
Anton 603
Ariel 94
我不知道错误在哪里。通过解释器,min(94,603)= 94,如预期的那样。我想念什么?
感谢帮助
PS:我也尝试过
min(n,d [f])
那是没有列表的相同函数,但结果始终是603
最佳答案
您正在比较字符串,而不是数字:
>>> 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
(因此用引号表示字符串)。关于python - Python 2.7-最小内置函数无法按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17881253/